Strich (-) vor Bash

14

Wenn ich meine Bash-Shell in einem OS X (10.6.4) -Terminal untersuche, z. B. durch Eingabe echo $0, befindet sich vor meiner Shell ein Bindestrich wie folgt : -bash. Was bedeutet dieser Strich?

marshall.ward
quelle

Antworten:

14

Dies bedeutet, dass bashes als Login-Shell aufgerufen wird.


man bash sagt:

Eine Anmeldeshell ist eine Shell, deren erstes Zeichen des Arguments Null a ist -, oder eine, die mit der --loginOption begonnen wurde.

Wenn bash als interaktive Anmeldeshell oder als nicht interaktive Shell mit der --loginOption aufgerufen wird , werden zuerst Befehle aus der Datei gelesen und ausgeführt /etc/profile, sofern diese Datei vorhanden ist. Nachdem die Datei zu lesen, sucht er nach ~/.bash_profile, ~/.bash_loginund ~/.profilein dieser Reihenfolge, und liest und die Befehle ausführt , von der ersten , die lesbar existiert und ist. Die --noprofileOption kann verwendet werden, wenn die Shell gestartet wird, um dieses Verhalten zu verhindern.

Wenn eine Anmeldeshell beendet wird, liest bash Befehle aus der Datei und führt sie aus ~/.bash_logout, falls vorhanden.


Sie finden login -pfin Ihrer psAusgabe, die standardmäßig eine Login-Shell startet.

Versuchen Sie zu laufen login -pfund login -pflsehen Sie den Unterschied. man loginbeschreibt den Unterschied:

-lWeist das durch die Anmeldung ausgeführte Programm an, dass dies keine Anmeldesitzung ist (gemäß Konvention wird dem Programm eine Anmeldesitzung mit einem Bindestrich als erstem Zeichen von signalisiert argv[0]; diese Option deaktiviert dies) und verhindert, dass es in das chdir(2)Ausgangsverzeichnis des Benutzers gelangt . Standardmäßig wird der Bindestrich hinzugefügt (dies ist eine Anmeldesitzung).

Daniel Beck
quelle
Tolle Antwort, danke für die Erklärung und manzitiert
Marshall.ward
1
Ich verwende Ubuntu und sehe verschiedene Verhaltensweisen von echo $0: Wenn ich echo $0das von aufgerufene Terminal eingebe ctrl + alt + f1, ist das Ergebnis -bash; aber wenn ich es in termianl eingebe, das von aufgerufen wird ctrl + alt + t, ist das Ergebnis bash(kein führender Bindestrich). Können Sie erklären, warum?
Frozen Flame
@ Frozen-Flame Einer ist eine Login-Shell, der andere nicht. Beachten Sie, dass sich OS X-Terminals und Linux-Terminals in dieser Hinsicht unterschiedlich verhalten.
Daniel Beck
@ DanielBeck das ist kein Beweis dafür, dass der andere keine Login-Shell ist. Wenn bash mit --loginargument gestartet wird , ändert es seine nicht argv[0], fungiert aber als Login-Shell.
Ruslan
@ Ruslan Sicher, theoretisch könnte es immer noch eine Login-Shell sein. Aber es ist nicht. (Zumindest wäre ich sehr überrascht, wenn es so wäre.)
Daniel Beck