Sh 和 Bash 的區別
本教程解釋了什麼是 shell,瞭解當前使用的 shell,檢查所有可用 shell 的列表,以及 sh
和 bash
之間的區別。
什麼是殼
shell 是一個接受命令的計算機程式。它還解釋命令並將它們傳遞給作業系統進行處理。它充當使用者和作業系統之間的介面,使用者可以通過它與作業系統進行互動。
大多數 Linux 作業系統至少帶有一個 shell 程式。shell 程式將是 Bash
、Dash
或兩者。
如何查詢當前 Shell
要了解當前在 Linux 系統上使用的 shell,我們可以閱讀 /etc/passwd
檔案,因為它儲存了使用者帳戶資訊。讓我們執行下面的命令來了解當前的 shell。
grep
命令用於在指定檔案中搜尋字串。下面的命令在位於 /etc
的 passwd
檔案中搜尋使用者 fumba
。當 grep
命令找到匹配項時,它會列印帶有結果的行。
$ grep fumba /etc/passwd
W 可以從下面的輸出中看到,使用者 fumba
的預設 shell 是 bash。
fumba:x:1000:1000:,,,:/home/fumba:/bin/bash
如何找到可用的 shell
Linux 系統中所有可用的 shell 都列在 /etc/shells
檔案中。我們使用下面的 cat
命令來顯示/etc/shells
檔案的內容。
cat /etc/shells
下面的輸出顯示了我們系統上所有可用 shell 的列表。
# /etc/shells: valid login shells
/bin/sh
/bin/bash
/usr/bin/bash
/bin/rbash
/usr/bin/rbash
/bin/dash
/usr/bin/dash
/usr/bin/tmux
/usr/bin/screen
sh
命令及其使用
sh
是 Bourne shell 的命令名稱。它是類 Unix 作業系統的標準命令語言直譯器。它從命令列字串、標準輸入或指定檔案執行命令。sh
符合 POSIX 標準。
行動式作業系統介面 (POSIX) 是 IEEE 計算機協會指定的一系列標準,用於維護作業系統之間的相容性。一旦遵循這些標準,這些標準有助於為多個作業系統開發跨平臺軟體。
大多數系統都有/bin/sh
檔案,但它是一個符號連結,不會呼叫 sh
。在 Ubuntu 中,/bin/sh
是到 Dash
shell 的符號連結。我們可以通過執行下面的命令來檢查。
$ file -h /bin/sh
下面的輸出顯示 /bin/sh
是到 dash
的符號連結。
/bin/sh: symbolic link to dash
讓我們將 #!/bin/sh
新增到指令碼中。
#!/bin/sh
printf "sh points to dash!\n"
上面的指令碼指定 /bin/sh
作為直譯器。然而,由於 /bin/sh
指向 dash
,dash
shell 將作為直譯器執行指令碼。
Bash
及其使用
Bash
代表 Bourne Again shell。和 sh
一樣,它是一個命令語言處理器和一個 shell。然而,bash 是 sh
的超集。它支援 sh
的特性並提供更多的擴充套件和特性。Bash
是 Linux 作業系統的預設 shell。
一開始,Bash
符合 POSIX 標準,但隨著時間的推移,隨著更多功能和擴充套件的新增,它不再遵循 POSIX 標準。但是,bash 仍然可以通過設定 -posix
標誌在 POSIX 模式下使用,如下所示。
$ bash --posix
讓我們編寫一個符合 POSIX 標準的 bash 指令碼。
#!/bin/bash
set -o posix
printf "we are using bash shell!\n"
bash
直譯器將執行上面的指令碼,因為它已在第一行 #!/bin/bash
中指定。
set
命令啟用指令碼中的選項。在我們的例子中,它使 bash shell 能夠在 POSIX 模式下執行指令碼。