
Was ist der Unterschied zwischen Laufen:
:~$./myscript
:~$bash ./myscript
:~$bash -c "./myscript"
(vorausgesetzt, ./myscript
es ist ausführbar)?
Antwort1
./myscript
läuft myscript
mit dem im Shebang angegebenen Interpreter. myscript
Das ausführbare Bit muss gesetzt sein.
bash ./myscript
läuft myscript
mit Bash. myscript
muss nicht ausführbar sein und da Bash eine Datei zum Ausführen erhält, sucht es nicht einmal im Pfad danach und bash myscript
funktioniert 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 -c
ist ein beliebiger Bash-Befehl oder eine beliebige Befehlsfolge (try bash -c "echo 'aa';echo 'bb'"
).
Und Sie haben nicht erwähnt. ./myscript
Antwort2
Angenommen, myscript
es ist ausführbar und hat eine Shebang-Zeile, die auf die bash
Binärdatei verweist – es gibt keinen Unterschied zwischen der ./myscript
alleinigen Ausführung oder bash ./myscript
, aber die Ausführung bash -c ./myscript
erstellt eine weitere Subshell-Ebene – was Sie sehen können, indem Sie die SHLVL
Variable ( bash terminal > running bash -c > running shebang line with bash
3 x bash) überprüfen.
Normalerweise befinden Sie sich in einer Bash-Terminalsitzung, wenn die Ausführung ./myscript
der Shebang-Zeile ein Fenster aufruft bash
und erstellt, bash subshell
in 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