Shebang, Dolmetscher und ein Skript

Shebang, Dolmetscher und ein Skript

Mit der folgenden Zeile können Sie shebangden Interpreter angeben, der zum Ausführen eines Skripts verwendet werden soll:

#!/bin/bash
echo "Hello world"

Meine Frage ist, wie wir im Skript feststellen können, welcher Interpreter tatsächlich verwendet wird. Folgendes funktioniert nicht:

echo $0
echo $SHELL

Antwort1

Wenn ich Sie richtig verstehe, möchten Sie die Shell aus der ersten Zeile des Skripts extrahieren.

Wenn Sie verwenden, $SHELLzeigen Sie die Shell an, die Sie tatsächlich verwenden. Diese muss nicht mit der in der ersten Zeile angegebenen identisch sein: Sie können beispielsweise den Befehl ./ verwenden source, um ein beliebiges Skript in der aktuell ausgeführten Shell auszuführen.

Im Folgenden wird die Shell ab der ersten Zeile angezeigt:

sed -n '1 s/^#!//p' "$0"

Hier $0ist das laufende Skript, und der sedBefehl druckt die erste Zeile ohne den führenden Teil #!. Wenn es keine solche Zeile gibt, wird nichts zurückgegeben, und Sie können dies überprüfen.

Sie können beispielsweise Folgendes verwenden, $(...)um den Wert aus dem sedBefehl abzurufen: -

echo Script "$0" is running with "$SHELL"
echo It should run with "$(sed -n '1 s/^#!//p' "$0")"

Antwort2

Verwenden:

echo $(readlink -e /proc/$$/exe)

(mit anderen Worten: Überprüfen Sie die ausführbare Datei für Ihren eigenen Prozess).

Bearbeiten: Es scheint $SHELLnicht zuverlässig zu sein. Schreiben Sie dies in eine idshellDatei:

echo I am process $$
echo SHELL is $SHELL
echo /proc/$$/exe is $(readlink -e /proc/$$/exe)

und vergleichen Sie dann die Ausgaben von:

>bash idshell
I am process 24012
SHELL is /bin/bash
/proc/24012/exe is /bin/bash

Und

>dash idshell
I am process 24062
SHELL is /bin/bash
/proc/24062/exe is /bin/dash

Ist das also dashLügen??? (und das ist auch so, shda es sich auf meinem Ubuntu auflöst dash).

verwandte Informationen