Ausführen von Bash-Skriptmodi

Ausführen von Bash-Skriptmodi

Was ist der Unterschied zwischen Laufen:

:~$./myscript

:~$bash ./myscript

:~$bash -c "./myscript"

(vorausgesetzt, ./myscriptes ist ausführbar)?

Antwort1

./myscriptläuft myscriptmit dem im Shebang angegebenen Interpreter. myscriptDas ausführbare Bit muss gesetzt sein.

bash ./myscriptläuft myscriptmit Bash. myscriptmuss nicht ausführbar sein und da Bash eine Datei zum Ausführen erhält, sucht es nicht einmal im Pfad danach und bash myscriptfunktioniert daher genauso gut.

bash -c "./myscript"startet eine Bash-Instanz, um einen Befehl auszuführen, der dann mit dem im Shebang angegebenen Interpreter ausgeführt wird ./myscript(ähnlich dem ersten Fall, nur mit einem zusätzlichen Bash-Prozess). Das Argument to bash -cist ein beliebiger Bash-Befehl oder eine beliebige Befehlsfolge (try bash -c "echo 'aa';echo 'bb'").

Und Sie haben nicht erwähnt. ./myscript

Antwort2

Angenommen, myscriptes ist ausführbar und hat eine Shebang-Zeile, die auf die bashBinärdatei verweist – es gibt keinen Unterschied zwischen der ./myscriptalleinigen Ausführung oder bash ./myscript, aber die Ausführung bash -c ./myscripterstellt eine weitere Subshell-Ebene – was Sie sehen können, indem Sie die SHLVLVariable ( bash terminal > running bash -c > running shebang line with bash3 x bash) überprüfen.

Normalerweise befinden Sie sich in einer Bash-Terminalsitzung, wenn die Ausführung ./myscriptder Shebang-Zeile ein Fenster aufruft bashund erstellt, bash subshellin dem die Befehle ausgeführt werden.

30311 pts/0    Ss     0:00 -bash
 8419 pts/0    S+     0:00  \_ /bin/bash ./test.sh
 8420 pts/0    R+     0:00      \_ ps f
SHELL LEVEL: 2  # is 3 when running with bash -c
8419  # that's the $BASHPID

Nehmen Sie den folgenden Code (test.sh) und probieren Sie ihn selbst aus.

#!/bin/bash

ps f
echo "SHELL LEVEL: $SHLVL"
echo $BASHPID

verwandte Informationen