man bash
sagt,
A login shell is one whose first character of argument zero is a -, or
one started with the --login option.
Wenn wir ein Terminal wie beispielsweise mintty -
Cygwin aufrufen, können wir einen einzelnen Bindestrich ( -
) von $0 sehen.
$ echo $0
-bash
Wenn wir jedoch eine Login-Shell mit --login
Option aufrufen, können wir nicht sehen -
.
$bash --login
$echo $0
bash
Meine Fragen sind:
Welche Rolle spielt
-
? Obwohl wir es bei der aufgerufenen Login-Shell nicht sehen können--login
, können wir den Shell-Typ überprüfen, indem wir einfach verwandte Shell-Optionen wie abfragenshopt -q login_shell
. Wofür ist es?Wenn eine wichtige Rolle von spielt
-
, warum wird es dann in der mit aufgerufenen Login-Shell nicht angezeigt--login
?Wie können wir manuell eine Login-Shell aufrufen, deren Nullargument mit beginnt
-
?Dies ist auch bei anderen Shells der Fall, beispielsweise zsh, csh?
Antwort1
Der führende Bindestrich im Prozessnamen ( argv[0]
genauer gesagt in ) wird dort von dem Prozess platziert, der die Shell aufruft – login
oder etwas Ähnliches. Er teilt dem Shell-Programm mit, dass es als Login-Shell fungieren soll (lesen .profile
usw.). Das Shell-Programm kann sich unter anderen Umständen dafür entscheiden, als Login-Shell zu fungieren (z. B. fungieren bash und zsh als Login-Shell, wenn ihnen die -l
Befehlszeilenoption übergeben wird).
Um Ihre Fragen zu beantworten:
- Die Funktion von
-
besteht darin, der Shell mitzuteilen, dass sie sich wie eine Login-Shell verhalten soll. Für Bash--login
ist die Übergabe über die Befehlszeile gleichwertig. - Du kannst das ... sehenRolle von
-
bei Bash, das mit der--login
Option aufgerufen wird, lautet es~/.profile
usw. Sie können nicht sehen,-bash
ob Bash als aufgerufen wurdebash --login
, sondern-bash
weil Bash nicht als aufgerufen wurde-bash
. - Bei normalen Shells können Sie das nullte Argument nicht auswählen, es muss der Befehlsname sein. Mit zsh können Sie
ARGV0=-bash bash
und mit verwendenksh93
,bash
oderzsh
können Sie verwenden(exec -a -bash bash)
. Inmksh
oderzsh
können Sie verwendenhash -- -bash=/bin/bash; -bash
. Sie können nichts wie verwenden,ln -s /bin/bash ./-bash; ./-bash
da das Ganzeargv[0]
mit beginnen muss-
. Sie könnten verwendenPATH=:$PATH; -bash
, aber dann hat dies den unangenehmen Nebeneffekt, dass""
vor hinzugefügt wird$PATH
. - Ja.
Siehe auchUnterschied zwischen Login-Shell und Nicht-Login-Shell?
Antwort2
Frage 1 und 2
Abgesehen von man bash
dem, was Sie in Ihrer Frage angeben, heißt es in der ManpageoderSie haben also zwei Möglichkeiten, die Login-Shell zu starten:
- Das erste Zeichen des Arguments Null ist ein
-
. - mit der Option --login gestartet.
und bidirektional ist unabhängig voneinander. Eine Shell, deren erstes Zeichen des Arguments Null ein-
musseine Login-Shell sein. Aber eine Shell, deren erstes Argumentzeichen Null nicht a ist, -
kann trotzdem eine Login-Shell sein oder nicht. Sie ist eine Login-Shell, wenn sie mit aufgerufen wird --login
.
Eine andere Möglichkeit zum Überprüfen einer Login-Shell:
$ cuonglm at ~
$ bash --login
$ cuonglm at ~
$ grep -- -l /proc/$$/cmdline
Binary file /proc/7620/cmdline matches
Frage 3
Ein einfacher Weg:
$ cuonglm at ~
$ sudo su -
% root at ~
% shopt -q login_shell && echo "Login shell" || echo "Not login shell"
Login shell
Frage 4
Soweit ich weiß, ist zsh
es csh
dasselbe wie bash
in diesem Fall.