Last Updated on 2021-07-24 by Clay
在我們操作 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
- https://wiki.ubuntu.com/DashAsBinSh
- https://askubuntu.com/questions/1064773/how-can-i-make-bin-sh-point-to-bin-bash
- https://unix.stackexchange.com/questions/442510/how-to-use-bash-for-sh-in-ubuntu
- https://www.howtogeek.com/669835/how-to-change-your-default-shell-on-linux-with-chsh/