Muszę uruchomić skrypt, kiedy loguję się i wylogowuję z mojego Ubuntu.
Próbowałem umieścić skrypt w moim, ~/.bash_login
ale 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.sh
i jest wykonywalny.
edytować:
mój skrypt działa, gdy piszę: /home/gsd/script/login.sh
i ustawia się za pomocą + x
Teraz tylko: touch /home/gsd/test.txt
w ~/.bash_login
celu 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
~/.bash_profile
?-rw-r--r-- 1 gsd gsd 313 2012-01-22 11:56 .bash_login
chmod +x .bash_login
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ącsource ~/.bash_login
).Odpowiedzi:
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_profile
i.bash_login
są analogiczne, więc zalecam wpisywanie poleceń.bash_profile
, ponieważ są one powszechnie używane i.bash_login
stosunkowo nieznane. Zastanów się również nad wprowadzeniem poleceń.bashrc
zamiast.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ą:
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_profile
i.bash_login
.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,
.bashrc
ale 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źródło
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.bashrc
bę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:.bash_profile
.bash_login
.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
--login
opcją.źródło
.profile
plik jest odczytywany i wykonywany tylko wtedy, gdy użytkownik loguje się za pomocą interfejsu graficznego. W przeciwnym razie nie jest czytany.~/.profile
zdecydowanie czytam w nie graficznych powłokach logowania (testowałem, przełączając się na inny terminalCtrl+Alt+F2
i logując się tam)..profile
nie jestem tylko.bashrc
Upewnij się, że skrypt, który chcesz uruchomić, jest wykonywalny. Biegnij,
chmod +x scriptname
aby to zrobić. Upewnij się także, że skrypt zaczyna się od poprawnego shebang (#!/bin/bash
dla skryptów powłoki). Na koniec, użyj wszystkich pełnych ścieżek podczas jego wykonywania, np./usr/bin/echo
Zamiast poecho
prostu zainicjować środowisko, w którym skrypt będzie wykonywany, nie jest identyczne z tym, do którego jesteś przyzwyczajony.źródło
Bash szuka plików
.bash_login
lub tylko.profile
wtedy, 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-terminal
bash, uruchamiany jest jako powłoka niezalogowana.To wyraźnie stwierdza, że jeśli uruchamiasz się w Gnome,
.bash_login
nie 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 .
źródło