Warum gibt 'echo $ 0' für zwei verschiedene Terminals ein unterschiedliches Ergebnis aus?

15

Ich habe ein Terminal unter Ubuntu mit Ctrl+ Alt+ Tund einem anderen Terminal geöffnet, indem ich in ein Verzeichnis gegangen bin und dann mit der rechten Maustaste geklickt habe und "Open in Terminal" gewählt habe.

Ich habe echo $0in beiden Fällen eine gemacht.

Im ersten Fall:

$ echo $0
-bash

Im zweiten Fall:

$ echo $0
/bin/bash

Warum dieser Unterschied?

Code blau
quelle
$ 0 gibt den Namen des laufenden Prozesses zurück.
Ramesh
Führen Sie zwei Terminals mit unterschiedlichen Benutzern aus?
Dienstag,
Ich benutze den gleichen Benutzer
CodeBlue
Handelt es sich tatsächlich um verschiedene Terminalemulatoren oder nur um zwei Instanzen desselben Terminalemulators? Sind beide das Standardterminal?
Terdon

Antworten:

16

Wenn die Ausgabe des echo $0Befehls ist -bash, bedeutet dies, dass bashals Login-Shell aufgerufen wurde. Wenn es sich nur bashum eine Ausgabe handelt , befinden Sie sich in einer Shell ohne Anmeldung.

man bash sagt irgendwo in Zeile 126:

A  login shell is one whose first character of argument zero is a -, or 
one started with the --login option.

Weitere Informationen finden Sie hier: Unterschied zwischen Login-Shell und Nicht-Login-Shell? .

Um zu erklären, warum Sie /bin/bashin den zweiten Fall geraten , kann ich sagen, dass ein Programm (in Ihrem Fall Ihr Dateimanager, wahrscheinlich Nautilus) oder ein Skript sein eigenes $0in etwas anderes ändern kann . Als Beispiel sehen Sie, was $0in meinem Terminal passiert (immer das gleiche Terminal):

Bildbeschreibung hier eingeben

Radu Rădeanu
quelle
12

Der Unterschied liegt in der Art und Weise, wie diese begonnen wurden. Bash wird unterschiedlich initialisiert (verschiedene Start-Skripte lesen), abhängig von argv [0]. Wenn die Zeichenfolge mit einem Bindestrich -wie in beginnt, wird -bashsie als Anmeldeshell ausgeführt. Andernfalls wird sie als interaktive Shell ausgeführt. Es kann auch als nicht interaktive Shell (dh in einem Shell-Skript) ausgeführt werden.

Um mehr zu erfahren, lesen Sie am besten das Handbuch man bashim Abschnitt INVOCATION.

X Tian
quelle
9

Eine Shell wird gestartet, wenn Sie sich anmelden, sie wird jedoch auch von Programmen wie makeoder beim Ausführen eines Shell-Skripts oder beim Eingeben :shvon vioder beim Erstellen eines neuen Terminalfensters gestartet.

Ursprünglich wurde die Shell ~/.profilebeim Anmelden oder Ausführen eingelesen su. Mit diesem Skript können Sie beispielsweise ankündigen, ob Sie eine neue E-Mail erhalten haben, Ihre Lösch- und Kill-Zeichen anpassen sowie die Variablen TERM und PATH festlegen und exportieren. Beim Starten in fast jedem anderen Kontext wurde die Shell nicht gelesen ~/.profile, da die meisten dieser Vorgänge überflüssig wären. Es wurde erwartet, dass Sie alle wichtigen Shell-Variablen in die neue Shell exportiert haben.

Die Art und Weise, wie die Shell wusste, ob sie einlesen sollte, ~/.profilebestand darin, zu überprüfen, ob das erste Zeichen von argv[0]aka $0war '-'.

Zunächst cshwurden Aliase eingeführt. Aliase wurden nicht in die Umwelt exportiert. cshwurde entwickelt, um zwei verschiedene Initialisierungsskripte einzulesen. ~/.loginwurde nur gelesen, wenn ein Benutzer angemeldet war, und der Anhaltspunkt dafür war, wenn argv[0]mit begonnen wurde '-'. ~/.cshrcwurde jedes Mal gelesen, wenn die Shell gestartet wurde. Im Allgemeinen legte man Aliase in ~/.cshrcund alles andere in ~/.login. cshauch unterstützt ~/.logout, die in den meisten Fällen nur den Bildschirm gelöscht und ausgeführt fortune.

Andere Shells übernahmen die gleichen Funktionen. kshwürde einlesen ~/.kshrc, bashwürde einlesen ~/.bashrc, und dort würden Sie Ihre Aliasdefinitionen platzieren.

Um es kurz zu machen, die Anwendung, die eine Shell erzeugt, muss entscheiden, ob es sich um eine "Login-Shell" handelt, in welchem ​​Fall es diese '-'am Anfang gibt, oder um eine reguläre Shell. In den meisten Fällen wird eine Shell, die interaktiv sein soll, als Anmeldeshell gestartet, und eine Shell dient nur zum Ausführen einiger Befehle, entweder als Argumente oder aus einem Skript, und beim Beenden handelt es sich um eine reguläre Shell.

Aber es hängt alles von der Laune der Anwendung ab, die die Shell startet.

Mark Plotnick
quelle