Warum können wir in einer mit der Option „--login“ aufgerufenen Login-Shell keinen einzelnen Bindestrich ab $0 sehen?

Warum können wir in einer mit der Option „--login“ aufgerufenen Login-Shell keinen einzelnen Bindestrich ab $0 sehen?

man bashsagt,

 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 --loginOption aufrufen, können wir nicht sehen -.

$bash --login
$echo $0
bash

Meine Fragen sind:

  1. 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 abfragen shopt -q login_shell. Wofür ist es?

  2. Wenn eine wichtige Rolle von spielt -, warum wird es dann in der mit aufgerufenen Login-Shell nicht angezeigt --login?

  3. Wie können wir manuell eine Login-Shell aufrufen, deren Nullargument mit beginnt -?

  4. 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 – loginoder etwas Ähnliches. Er teilt dem Shell-Programm mit, dass es als Login-Shell fungieren soll (lesen .profileusw.). 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 -lBefehlszeilenoption übergeben wird).

Um Ihre Fragen zu beantworten:

  1. Die Funktion von -besteht darin, der Shell mitzuteilen, dass sie sich wie eine Login-Shell verhalten soll. Für Bash --loginist die Übergabe über die Befehlszeile gleichwertig.
  2. Du kannst das ... sehenRolle von-bei Bash, das mit der --loginOption aufgerufen wird, lautet es ~/.profileusw. Sie können nicht sehen, -bashob Bash als aufgerufen wurde bash --login, sondern -bashweil Bash nicht als aufgerufen wurde -bash.
  3. Bei normalen Shells können Sie das nullte Argument nicht auswählen, es muss der Befehlsname sein. Mit zsh können Sie ARGV0=-bash bashund mit verwenden ksh93, bashoder zshkönnen Sie verwenden (exec -a -bash bash). In mkshoder zshkönnen Sie verwenden hash -- -bash=/bin/bash; -bash. Sie können nichts wie verwenden, ln -s /bin/bash ./-bash; ./-bashda das Ganze argv[0]mit beginnen muss -. Sie könnten verwenden PATH=:$PATH; -bash, aber dann hat dies den unangenehmen Nebeneffekt, dass ""vor hinzugefügt wird $PATH.
  4. Ja.

Siehe auchUnterschied zwischen Login-Shell und Nicht-Login-Shell?

Antwort2

Frage 1 und 2

Abgesehen von man bashdem, 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 zshes cshdasselbe wie bashin diesem Fall.

verwandte Informationen