GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Welcher Shell-Interpreter führt ein Skript ohne Shebang aus?

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 beispielsweise dash , 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.
Verwandte:Durchlaufen von Dateien mit Leerzeichen im Namen?

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.


Linux
  1. Basisname mit Leerzeichen in einem Bash-Skript?

  2. So schließen Sie eine Datei in ein Bash-Shell-Skript ein

  3. Shell-Skript ändert Verzeichnis mit Variable

  4. So fügen Sie Shebang # hinzu! mit PHP-Skript unter Linux?

  5. Berechtigung zum Ausführen von cron mit bash.sh verweigert

Automatisieren Sie die Bildverarbeitung mit diesem Bash-Skript

So schreiben Sie ein Bash-Skript mit Beispielen

Bash Shebang

Shell-Scripting Teil I:Erste Schritte mit Bash-Scripting

Was ist Shebang in Linux Shell Scripting?

Bash Scripting Einführungstutorial mit 5 praktischen Beispielen