【Bash 基本語法 #2】什麼是 #!/bin/bash, #!/bin/sh,為什麼要加在 script 前面 (問題解決:sh, bash 的不同)

前言

撰寫 bash 的 程式碼可以幫助我們自動化完成一連串的指令,
(或者我們也會說這是一種「腳本」,會自動完成一些事情)

以下的功能,建立在 「chmod +x」 的條件下才有用
如果沒有下「chmod +x」,使變成 .sh 執行檔

  • 則會有以下兩種情況:

./test.sh:會以預設的 shell 執行,例如 sh (dash)、或有安裝 zsh, fish 的話
(可能會有語言不通無法執行的問題,即使有加 #!/bin/bash)
bash ./test.sh:指定 bash 的語言,來解釋執行腳本
zsh ./test.sh:指定 zsh 的語言,來解釋執行腳本,其他以此類推

作為宣告解釋這份腳本的語言使用

有時候我們看到任何一份 “.sh” 開頭的檔案,
第一行都會寫

#!/bin/bash

這其實就是在宣告,這份腳本的執行,
請用 bash 的語言來解釋他,

sh 系列的語言有很多種,雖然大同小異,
但實際上功能依然有些微的差別,
例如有些 bash 有的指令,換成 zsh 可能就有不同的寫法。

影響

如果我們沒有加入這行指定使用的 shell script,
大部分情況可能都沒有問題,
(那是因為語言共通性高的緣故),
但碰到一些語言不共通的時候,例如 sh, bash

sh 其實是 dash 的縮寫,讀者有興趣的話可以看下方的說明。

我們可以透過以下指令來看現在電腦中有哪些可使用的 shell script

cat /etc/shells

確認現在 terminal 使用的 shell script

echo $SHELL

科普類

sh 其實是某一個語言的簡稱

我們可以透過以下指令來看,現在是用什麼來解釋 sh 這個語言

ls -l /bin/sh

我們可能得到結果是:

lrwxrwxrwx 1 root root 413  2020 /bin/sh -> dash

表示 sh 其實是 dash 的 soft link (捷徑),並不等同於 bash

這也是為什麼有時候 「sh ./test.sh」、 「bash ./test.sh」會有一個可執行,
另外一個不可執行的原因
延伸閱讀:[Linux] sh 和 bash 之間的差異

Reference