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 $0
in beiden Fällen eine gemacht.
Im ersten Fall:
$ echo $0
-bash
Im zweiten Fall:
$ echo $0
/bin/bash
Warum dieser Unterschied?
bash
ubuntu
terminal
gnome-terminal
Code blau
quelle
quelle
Antworten:
Wenn die Ausgabe des
echo $0
Befehls ist-bash
, bedeutet dies, dassbash
als Login-Shell aufgerufen wurde. Wenn es sich nurbash
um eine Ausgabe handelt , befinden Sie sich in einer Shell ohne Anmeldung.man bash
sagt irgendwo in Zeile 126:Weitere Informationen finden Sie hier: Unterschied zwischen Login-Shell und Nicht-Login-Shell? .
Um zu erklären, warum Sie
/bin/bash
in den zweiten Fall geraten , kann ich sagen, dass ein Programm (in Ihrem Fall Ihr Dateimanager, wahrscheinlich Nautilus) oder ein Skript sein eigenes$0
in etwas anderes ändern kann . Als Beispiel sehen Sie, was$0
in meinem Terminal passiert (immer das gleiche Terminal):quelle
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-bash
sie 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 bash
im Abschnitt INVOCATION.quelle
Eine Shell wird gestartet, wenn Sie sich anmelden, sie wird jedoch auch von Programmen wie
make
oder beim Ausführen eines Shell-Skripts oder beim Eingeben:sh
vonvi
oder beim Erstellen eines neuen Terminalfensters gestartet.Ursprünglich wurde die Shell
~/.profile
beim Anmelden oder Ausführen eingelesensu
. 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,
~/.profile
bestand darin, zu überprüfen, ob das erste Zeichen vonargv[0]
aka$0
war'-'
.Zunächst
csh
wurden Aliase eingeführt. Aliase wurden nicht in die Umwelt exportiert.csh
wurde entwickelt, um zwei verschiedene Initialisierungsskripte einzulesen.~/.login
wurde nur gelesen, wenn ein Benutzer angemeldet war, und der Anhaltspunkt dafür war, wennargv[0]
mit begonnen wurde'-'
.~/.cshrc
wurde jedes Mal gelesen, wenn die Shell gestartet wurde. Im Allgemeinen legte man Aliase in~/.cshrc
und alles andere in~/.login
.csh
auch unterstützt~/.logout
, die in den meisten Fällen nur den Bildschirm gelöscht und ausgeführtfortune
.Andere Shells übernahmen die gleichen Funktionen.
ksh
würde einlesen~/.kshrc
,bash
wü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.
quelle