
運行有什麼差別:
:~$./myscript
:~$bash ./myscript
:~$bash -c "./myscript"
(假設./myscript
是可執行的)?
答案1
./myscript
myscript
使用 shebang 中指定的任何解釋器運作。myscript
需要設定可執行位。
bash ./myscript
與 bash 一起運行myscript
。myscript
不需要是可執行的,並且由於 bash 被賦予了一個要運行的文件,因此它甚至不需要在 PATH 中查找它,因此bash myscript
也可以正常工作。
bash -c "./myscript"
啟動一個 bash 實例來執行命令,這恰好使它./myscript
使用 shebang 中指定的任何解釋器執行(因此它類似於第一種情況,但添加了 bash 進程)。的參數bash -c
是任何 bash 指令或指令序列(try bash -c "echo 'aa';echo 'bb'"
)。
而你還沒有提到. ./myscript
答案2
假設myscript
是可執行的並且有一個指向二進位檔案的 shebang 行-單獨bash
運行 或 之間沒有區別,但運行會創建另一個子 shell 級別 - 您可以透過檢查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