
Mit der folgenden Zeile können Sie shebang
den 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, $SHELL
zeigen 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 $0
ist das laufende Skript, und der sed
Befehl 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 sed
Befehl 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 $SHELL
nicht zuverlässig zu sein. Schreiben Sie dies in eine idshell
Datei:
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 dash
Lügen??? (und das ist auch so, sh
da es sich auf meinem Ubuntu auflöst dash
).