Dash (-) przed bash

9

Jeśli sprawdzę moją powłokę bash w terminalu OS X (10.6.4), na przykład wpisując echo $0, przed moją skorupą znajduje się myślnik: -bash. Co to oznacza?

marshall.ward
źródło

Odpowiedzi:

9

To znaczy, że bash jest wywoływany jako powłoka logowania.


man bash mówi:

Powłoka logowania to taka, której pierwszym znakiem argumentu zero jest a -lub jeden rozpoczął się od --login opcja.

Gdy bash jest wywoływany jako interaktywna powłoka logowania lub jako nieinteraktywna powłoka z --login opcja, najpierw odczytuje i wykonuje polecenia z pliku /etc/profile, jeśli ten plik istnieje. Po przeczytaniu tego pliku szuka ~/.bash_profile, ~/.bash_login, i ~/.profile, w tej kolejności, czyta i wykonuje polecenia z pierwszego, który istnieje i jest czytelny. The --noprofile opcja może być użyta, gdy powłoka jest uruchamiana, aby zahamować to zachowanie.

Po zamknięciu powłoki logowania bash odczytuje i wykonuje polecenia z pliku ~/.bash_logout, jeśli istnieje.


Znajdziesz login -pf w Twoim ps wyjście, które domyślnie uruchamia powłokę logowania.

Spróbuj uruchomić login -pf i login -pfl i zobacz różnicę. man login opisuje różnicę:

-l Informuje program wykonywany przez logowanie, że nie jest to sesja logowania (zgodnie z konwencją, sesja logowania jest sygnalizowana programowi łącznikiem jako pierwszy znak argv[0]; ta opcja wyłącza to) i zapobiega temu chdir(2) do katalogu domowego użytkownika. Domyślnie dodaje się myślnik (jest to sesja logowania).

Daniel Beck
źródło
Świetna odpowiedź, dzięki za wyjaśnienie i man cytuje
marshall.ward
1
Używam ubuntu i widzę różne zachowania echo $0: jeśli piszę echo $0 w terminalu wywoływanym przez ctrl + alt + f1, wynik to -bash; ale jeśli wpiszę to w terminalu wywołanym przez ctrl + alt + t, wynik jest bash (brak linii prowadzącej). Czy mógłbyś wyjaśnić dlaczego?
Frozen Flame
@ frozen-flame One to powłoka logowania, a druga nie. Zauważ, że terminale OS X i Linux mają w tym względzie inne zachowanie.
Daniel Beck
@DanielBeck to nie jest dowód na to, że drugi nie jest powłoką logowania. Po uruchomieniu bash --login argument, to nie zmienia jego argv[0], ale działa jako powłoka logowania.
Ruslan
@Ruslan Pewnie, teoretycznie nadal może być powłoką logowania. Ale nie jest. (Przynajmniej byłbym bardzo zaskoczony, gdyby tak było.)
Daniel Beck