
実行の違いは何ですか:
:~$./myscript
:~$bash ./myscript
:~$bash -c "./myscript"
(./myscript
実行可能であると仮定)?
答え1
./myscript
myscript
シェバンで指定されたインタープリタで実行されます。myscript
実行可能ビットが設定されている必要があります。
bash ./myscript
myscript
bash で実行されます。myscript
実行可能である必要はなく、bash には実行するファイルが与えられているため、PATH 内でそのファイルを探すことすらなく、bash myscript
同様に動作します。
bash -c "./myscript"
コマンドを実行するためにBASHインスタンスを開始します。これは、シバンで指定されているインタープリターで実行するようにします./myscript
(したがって、BASHプロセスを追加しますbash -c
)bash -c "echo 'aa';echo 'bb'"
。
そしてあなたは言及しなかった. ./myscript
答え2
myscript
が実行可能であり、バイナリを指すシェバン行を持っていると仮定すると、単独でbash
実行する場合と を実行する場合の違いはありませんが、 を実行するとサブシェル レベルが 1 つ追加されます。これは、 var ( 3 x bash)をチェックすることで確認できます。./myscript
bash ./myscript
bash -c ./myscript
SHLVL
bash terminal > running bash -c > running shebang line with bash
通常、bash ターミナル セッションでは、./myscript
shebang 行を実行すると、コマンドを実行する が呼び出されbash
、作成されます。bash subshell
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
以下のコード (test.sh) を自分で試してみてください。
#!/bin/bash
ps f
echo "SHELL LEVEL: $SHLVL"
echo $BASHPID