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

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


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ą.


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.


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 .

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.