Uruchom skrypt przy logowaniu przy użyciu ~ / .bash_login

15

Muszę uruchomić skrypt, kiedy loguję się i wylogowuję z mojego Ubuntu.

Próbowałem umieścić skrypt w moim, ~/.bash_loginale to nie zadziałało.

Czy jest lepsza lokalizacja, w której mogę uruchomić skrypt?

Mój skrypt znajduje się w /home/gsd/script/login.shi jest wykonywalny.

edytować:

mój skrypt działa, gdy piszę: /home/gsd/script/login.shi ustawia się za pomocą + x

Teraz tylko: touch /home/gsd/test.txtw ~/.bash_logincelu badania.

plik test.txt nigdy nie jest tworzony

edycja 2:

gsd@laptop:~$ ll ~/.bash*
-rw------- 1 gsd gsd 38639 2012-01-25 17:25 .bash_history
-rw-r--r-- 1 gsd gsd    29 2012-01-25 15:22 .bash_login
-rw-r--r-- 1 gsd gsd   220 2011-11-03 19:22 .bash_logout
-rw-r--r-- 1 gsd gsd  3136 2011-11-04 08:00 .bashrc
Gino Sullivan
źródło
czy .bash_login ma odpowiednie uprawnienia? co zwraca ls -l .bash_login?
santiagozky
Czy ty też masz ~/.bash_profile?
enzotib
-rw-r--r-- 1 gsd gsd 313 2012-01-22 11:56 .bash_login
Gino Sullivan
1
chmod +x .bash_login
Zoke,
1
Nie jest konieczne chmod +x .bash_login(ustawianie bitu wykonywalnego na .bash_login). Podręcznik Bash jest nieco mylący w tym obszarze, ale Bash nie wyprowadza .bash_login jak skrypt powłoki. Odczytuje plik, a następnie wykonuje zawarte w nim polecenia (możesz zrobić coś podobnego, uruchamiając source ~/.bash_login).
Stefan Lasiewski,

Odpowiedzi:

20

Jeśli istnieje plik .bash_profile, Bash nie będzie czytał pliku .bash_login (lub .profile). Ta irytująca funkcja została opisana w niektórych wersjach instrukcji Bash, ale nie we wszystkich.

.bash_profilei .bash_loginsą analogiczne, więc zalecam wpisywanie poleceń .bash_profile, ponieważ są one powszechnie używane i .bash_loginstosunkowo nieznane. Zastanów się również nad wprowadzeniem poleceń .bashrczamiast .bash_profile. Podręcznik opisuje różnicę między „interaktywną powłoką niezalogowaną” a „interaktywną powłoką logowania”, więc przeczytaj tę sekcję.

Podręcznik GNU Bash Reference wersja 4.1: Pliki startowe Bash mówią:

szuka ~ / .bash_profile, ~ / .bash_login i ~ / .profile w tej kolejności oraz odczytuje i wykonuje polecenia z pierwszego, który istnieje i jest czytelny.

Zobacz także to pytanie na temat superużytkownika i to howto Bash (nie zniechęcaj się adresem freeunix.dyndns.org:8088 --- to wciąż jest dobrej jakości instrukcja i używałem jej od lat).

Zaktualizuj , ponieważ mówisz, że nie masz pliku .bash_profile.

Wygląda na to, że nie używasz tak zwanej „interaktywnej powłoki niezalogowanej” (szczegółowy opis znajduje się w instrukcji Bash).

Aby to sprawdzić, należy dodać coś takiego do każdego pliku: .bashrc, .bash_profilei .bash_login.

echo "DEBUG: I am .bashrc"

echo "DEBUG: I am .bash_profile"

Następnie wyloguj się i zaloguj ponownie. Gdy się zalogujesz, założę się, że zobaczysz tylko zwrot „DEBUG: Jestem .bashrc”, ale nie „Jestem .bash_profile”. Jeśli tak, oznacza to, że jesteś „interaktywną powłoką niezalogowaną”, co po prostu oznacza, że ​​Bash zadzwoni, .bashrcale nie .bash_profile. Aby dowiedzieć się, dlaczego te pliki kropkowe są takie, jakie są, zobacz poniższy post @Andrejs Cainikovs i http://mywiki.wooledge.org/DotFiles

Stefan Lasiewski
źródło
zaktualizowałem swoje pytanie, nie mam profilu bash
Gino Sullivan
Ok, ponieważ wcześniej powiedziałeś „tak mam profil bash”.
Stefan Lasiewski
tak, kazałem go potem usunąć, ale te same wyniki
Gino Sullivan
3
Ta odpowiedź rozwiązuje problem, myślę, że warto go zaakceptować.
Marius Butuc
1
Zauważ też, że te pliki bash są uruchamiane tylko podczas logowania do powłoki (przez Terminal, ssh itp.), A nie podczas logowania do GUI!
mivk 18.10.12
6

Powłoki logowania, niezależnie od tego, czy są interaktywne czy nieinteraktywne, odczytują i wykonują.profile

Interaktywne powłoki odczytują i wykonują .bashrc.

Często zobaczysz te /etc/profileźródła .bashrc- w ten sposób wszystkie wprowadzone ustawienia .bashrcbędą również obowiązywać w powłoce logowania, niezależnie od tego, czy jest to interaktywna czy nieinteraktywna.

Kolejność wykonywania skryptów inicjujących dla powłoki zależy od tego, czy powłoka jest interaktywna czy nieinteraktywna i nie jest powiązana z tym, czy jest to skrypt logowania, czy nie.

Gdy bash jest wywoływany jako interaktywna powłoka logowania , odczytuje i wykonuje polecenia z /etc/profile. Następnie Bash spróbuje wykonać TYLKO pierwszy plik, który można odczytać z:

  1. .bash_profile
  2. .bash_login
  3. .profile

Jeśli jeden z tych plików zostanie znaleziony, ale nie można go odczytać, spowoduje to błąd. Nie ma błędu, jeśli NIE zostanie znaleziony.

Ten sam proces jest wykonywany, gdy wywoływana jest nieinteraktywna powłoka logowania z --loginopcją.

jwilleke
źródło
1
AFAIK, .profileplik jest odczytywany i wykonywany tylko wtedy, gdy użytkownik loguje się za pomocą interfejsu graficznego. W przeciwnym razie nie jest czytany.
RajaRaviVarma
@RajaRaviVarma Właśnie przetestowałem (Ubuntu 16.04) i ~/.profilezdecydowanie czytam w nie graficznych powłokach logowania (testowałem, przełączając się na inny terminal Ctrl+Alt+F2i logując się tam).
waldyrious,
Zgadzam się z @RajaRaviVarma - Loguję się do maszyny Wirtualnej Ubuntu 16.04 przez SSH i .profilenie jestem tylko .bashrc
czytany
0

Upewnij się, że skrypt, który chcesz uruchomić, jest wykonywalny. Biegnij, chmod +x scriptnameaby to zrobić. Upewnij się także, że skrypt zaczyna się od poprawnego shebang ( #!/bin/bashdla skryptów powłoki). Na koniec, użyj wszystkich pełnych ścieżek podczas jego wykonywania, np. /usr/bin/echoZamiast po echoprostu zainicjować środowisko, w którym skrypt będzie wykonywany, nie jest identyczne z tym, do którego jesteś przyzwyczajony.

Biodro
źródło
0

Bash szuka plików .bash_loginlub tylko .profilewtedy, gdy jest wykonywany jako interaktywna powłoka logowania. Kiedy jest wykonywany jako interaktywna powłoka niezalogowana, czyta .bashrc.
Zwykle jest to drugi przypadek, tzn. Kiedy uruchamiasz gnome-terminalbash, uruchamiany jest jako powłoka niezalogowana.

To wyraźnie stwierdza, że ​​jeśli uruchamiasz się w Gnome, .bash_loginnie zostanie wykonane. Ale jeśli obniżysz poziom uruchamiania, aby uruchomić bezpośrednio bash, ten sam plik zostanie wykonany po pomyślnym zalogowaniu.
Zakładam, .bash_loginże zostanie wykonany również w przypadku zdalnych połączeń SSH.

Częściowo zgrane stąd .

Andrejs Cainikovs
źródło