運行 bash 腳本模式

運行 bash 腳本模式

運行有什麼差別:

:~$./myscript

:~$bash ./myscript

:~$bash -c "./myscript"

(假設./myscript是可執行的)?

答案1

./myscriptmyscript使用 shebang 中指定的任何解釋器運作。myscript需要設定可執行位。

bash ./myscript與 bash 一起運行myscriptmyscript不需要是可執行的,並且由於 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 )看到這一點./myscriptbash ./myscriptbash -c ./myscriptSHLVLbash terminal > running bash -c > running shebang line with bash

通常,您處於 bash 終端機會話中,執行./myscriptshebang 行時會呼叫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

相關內容