Skip to content

[Linux] sh 和 bash 之間的差異

在我們操作 Linux 系統的時候,我們經常會使用 “sh” 這個指令來執行一些副檔名為 .sh 的檔案,這些 .sh 的檔案都是所謂的 Shell script,也就是在 Linux 系統當中常見的腳本檔案,透過在腳本中撰寫指令,並使用解釋器執行,就能完成各式各樣的功能,比方說資料處理、自動化執行、管理系統資源 …… 而且寫成腳本檔之後就可以在有需求的時候直接執行,不用再重複編寫指令。

但是有時候,在我們按照網路上的教學所撰寫指令後,卻出現了各種指令錯誤的訊息 —— 這時候,多半是由於我們使用的 Shell 是 “sh”,而非性能較強的 bash。

在大部分系統上,/bin/sh 應當會透過軟連結連結到 bash,這時候,若我們使用 sh 執行檔案,那相當於我們透過 bash 的 POSIX 標準模式執行檔案。

那為什麼有時候 sh 並不等於 bash 呢?很多時候,這是因為 Ubuntu 自從某個版本以後,默認使用 dash (Debian Almquist Shell) 而非 bash (Bourne again / born again)。


什麼是 dash ?

dash 是比較輕量、速度比較快的 POSIX 標準 Shell,可以讓系統在執行各種系統指令時更加迅速,畢竟原先的 bash 比較複雜。

然後,dash 最大的問題就是在撰寫各種腳本檔時不若 bash 方便,還有著一些相容性問題。


什麼是 bash ?

bash 是個相當萬用的 Shell,其歷史也相當地悠久,以下直接節錄 WIKI 開頭的介紹:

—— 以下引用自 WIKI

Bash,Unix shell的一種,在1987年由布萊恩·福克斯為了GNU計劃而編寫。1989年釋出第一個正式版本,原先是計劃用在GNU作業系統上,但能執行於大多數類Unix系統的作業系統之上,包括Linux與Mac OS X v10.4都將它作為預設shell。
Bash是Bourne shell的後繼相容版本與開放原始碼版本,它的名稱來自Bourne shell(sh)的一個雙關語(Bourne again / born again):Bourne-Again SHell。
Bash是一個命令處理器,通常執行於文字窗口中,並能執行用戶直接輸入的命令。Bash還能從檔案中讀取命令,這樣的檔案稱為指令碼。和其他Unix shell 一樣,它支援檔名替換(萬用字元匹配)、管道、here文件、命令替換、變數,以及條件判斷和迴圈遍歷的結構控制語句。包括關鍵字、語法在內的基本特性全部是從sh借鑑過來的。其他特性,例如歷史命令,是從csh和ksh借鑑而來。總的來說,Bash雖然是一個滿足POSIX規範的shell,但有很多擴充。
一個名為Shellshock的安全漏洞在2014年9月初被發現,並迅速導致網際網路上的一系列攻擊。這個漏洞可追溯到1989年釋出的1.03版本。

切換 sh 連結至 dash 或 bash

要查看 /bin/sh 目前連結到的 Shell,可以使用以下指令查看:

ls -l /bin/sh

會看到像是以下這樣的畫面:

如果想要切換成 bash,那麼可以使用以下指令:

sudo dpkg-reconfigure dash

然後會看到以下這樣的畫面:

  • 選擇 Yes,則 /bin/sh 會連結到 dash;
  • 選擇 No,則 /bin/sh 會連結到 bash。

References


Read More

Tags:

Leave a Reply