Angenommen, die Standard-Shell für mein Konto ist zsh, aber ich habe das Terminal geöffnet und bash gestartet und ein Skript namens prac002.sh
ausgeführt , welcher Shell-Interpreter würde verwendet, um das Skript auszuführen, zsh oder bash? Betrachten Sie das folgende Beispiel:
[email protected] ~/My Files/My Programs/Learning/Shell % sudo cat /etc/passwd | grep papagolf
[sudo] password for papagolf:
papagolf:x:1000:1001:Rex,,,:/home/papagolf:/usr/bin/zsh
# papagolf's default shell is zsh
[email protected] ~/My Files/My Programs/Learning/Shell % bash
# I fired up bash. (See that '%' prompt in zsh changes to '$' prompt, indicating bash.)
[email protected]:~/My Files/My Programs/Learning/Shell$ ./prac002.sh
Enter username : Rex
Rex
# Which interpreter did it just use?
**BEARBEITEN:** Hier ist der Inhalt des Skripts
[email protected] ~/My Files/My Programs/Learning/Shell % cat ./prac002.sh
read -p "Enter username : " uname
echo $uname
Akzeptierte Antwort:
Weil das Skript nicht mit einem #!
beginnt shebang-Zeile, die angibt, welcher Interpreter verwendet werden soll, sagt POSIX Folgendes:
Wenn die execl()
Funktion aufgrund eines Fehlers fehlschlägt, der dem [ENOEXEC]-Fehler entspricht, der im Band System Interfaces von POSIX.1-2008 definiert ist, sollte die Shell einen Befehl ausführen, der dem Aufruf einer Shell mit dem aus der Suche resultierenden Pfadnamen entspricht erster Operand , wobei alle verbleibenden Argumente an die neue Shell übergeben werden, außer dass der Wert von „$0“ in der neuen Shell auf den Befehlsnamen gesetzt werden kann. Wenn die ausführbare Datei keine Textdatei ist, kann die Shell diese Befehlsausführung umgehen. In diesem Fall soll es eine Fehlermeldung schreiben und einen Exit-Status von 126 zurückgeben.
Diese Formulierung ist ein wenig zweideutig, und verschiedene Shells haben unterschiedliche Interpretationen.
In diesem Fall führt Bash das Skript mit sich selbst aus . Wenn Sie es andererseits von zsh aus ausführen würden, würde zsh sh
verwenden (was auch immer das auf Ihrem System ist) stattdessen.
Sie können dieses Verhalten für diesen Fall überprüfen, indem Sie diese Zeilen zum Skript hinzufügen:
echo $BASH_VERSION
echo $ZSH_VERSION
Sie werden feststellen, dass die erste Zeile von Bash Ihre Version ausgibt, während die zweite nie etwas sagt, egal welche Shell Sie verwenden.
- Falls Ihr
/bin/sh
ist beispielsweisedash
, dann wird keine Zeile etwas ausgeben, wenn das Skript von zsh oder dash ausgeführt wird. - Falls Ihr
/bin/sh
ein Link zu Bash ist, sehen Sie in allen Fällen die Ausgabe der ersten Zeile. - Falls
/bin/sh
ist eine andere Version von Bash als direkt verwenden, sehen Sie eine andere Ausgabe, wenn Sie das Skript direkt von bash und von zsh ausführen.
Der ps -p $$
Befehl aus der Antwort von rools zeigt auch nützliche Informationen über den Befehl, den die Shell zum Ausführen des Skripts verwendet hat.