Otworzyłem terminal na Ubuntu za pomocą Ctrl+ Alt+ Ti innego terminalu, przechodząc do katalogu, a następnie klikając prawym przyciskiem myszy i wybierając „Otwórz w terminalu”.
Zrobiłem echo $0
w obu przypadkach.
W pierwszym przypadku:
$ echo $0
-bash
W drugim przypadku:
$ echo $0
/bin/bash
Skąd ta różnica?
bash
ubuntu
terminal
gnome-terminal
CodeBlue
źródło
źródło
Odpowiedzi:
Jeśli wynikiem
echo $0
polecenia jest-bash
, oznacza to, żebash
został wywołany jako powłoka logowania. Jeśli dane wyjściowe są tylkobash
, oznacza to, że nie jesteś zalogowany.man bash
mówi gdzieś w linii 126:Zobacz więcej na ten temat: Różnica między powłoką logowania a powłoką niezalogowaną? .
Teraz, aby wyjaśnić, dlaczego dostajesz się
/bin/bash
w drugim przypadku, mogę powiedzieć, że program (w twoim przypadku menedżer plików, prawdopodobnie nautilus) lub skrypt może zmienić swój własny$0
na coś innego. Jako przykład zobacz, co się dzieje z$0
moim terminalem (cały czas ten sam terminal):źródło
Różnica polega na sposobie ich uruchomienia. bash będzie inicjował się inaczej (odczytuje różne skrypty startowe) w zależności od argv [0]. Jeśli ciąg zaczyna się od myślnika
-
jak w in,-bash
wówczas działa jako powłoka logowania, jeśli nie, będzie działać jako powłoka interaktywna. Może również działać jako powłoka nieinteraktywna (tj. W skrypcie powłoki).Aby dowiedzieć się więcej, najlepiej przeczytać instrukcję,
man bash
rozdział ZAPROSZENIE.źródło
Powłoka jest uruchamiana podczas logowania, ale jest również uruchamiana przez programy takie jak
make
lub podczas uruchamiania skryptu powłoki, podczas pisania:sh
dovi
lub tworzenia nowego okna terminala.Oryginalnie powłoka wczytywała się
~/.profile
po zalogowaniu lub uruchomieniusu
. Ten skrypt służy do ogłaszania, czy masz nowy e-mail, dostosowywania znaków kasowania i zabijania oraz ustawiania i eksportowania zmiennych TERM i PATH. Po uruchomieniu w prawie każdym innym kontekście powłoka nie czytała~/.profile
, ponieważ wykonanie większości tych czynności byłoby zbędne. Oczekiwano, że wyeksportowano wszystkie ważne zmienne powłoki do nowej powłoki.Sposób powłoka wiedział, czy odczytywane
~/.profile
było sprawdzenie, czy pierwszy znakargv[0]
, znany$0
był'-'
.Począwszy od
csh
, wprowadzono aliasy. Aliasy nie zostały wyeksportowane do środowiska.csh
został zaprojektowany do odczytu w dwóch różnych skryptach inicjujących.~/.login
został odczytany tylko wtedy, gdy użytkownik się zalogował, a wskazówką, aby to zrobić, byłoargv[0]
rozpoczęcie'-'
.~/.cshrc
był czytany przy każdym uruchomieniu powłoki. Ogólnie, umieszcza się aliasy~/.cshrc
i wszystko inne w~/.login
.csh
obsługiwane również~/.logout
, co w większości przypadków po prostu wyczyściło ekran i uruchomiło sięfortune
.Inne pociski przyjęły te same funkcje.
ksh
wczytywałoby~/.kshrc
,bash
wczytywałoby się~/.bashrc
, a tam byłyby miejsca, w których należy umieścić definicje aliasów.Krótko mówiąc, aplikacja, która spawnuje powłokę, decyduje, czy powinna to być „powłoka logowania”, w takim przypadku
'-'
na początku, czy zwykła powłoka. W większości przypadków powłoka, która ma być interaktywna, jest uruchamiana jako powłoka logowania, a powłoka służy tylko do uruchamiania niektórych poleceń, jako argumentów lub skryptu, a następnie wyjście jest zwykłą powłoką.Ale wszystko zależy od kaprysu aplikacji, która uruchamia powłokę.
źródło