Linux—/bin/sh辕录、/bin/bash昵仅、/bin/dash的區(qū)別

bash

bash 是一個為GNU計劃編寫的Unix shell缓熟。它的名字是一系列縮寫:Bourne-Again SHell — 這是關于Bourne shell(sh)的一個雙關語(Bourne again / born again)。Bourne shell是一個早期的重要shell摔笤,由史蒂夫·伯恩在1978年前后編寫够滑,并同Version 7 Unix一起發(fā)布。bash則在1987年由布萊恩·嘎朗溃克斯創(chuàng)造彰触。

bash (GNU Bourne-Again Shell) 是許多Linux發(fā)行版的默認Shell 。事實上命辖,還有許多傳統(tǒng)UNIX上用的Shell况毅,例如tcsh、csh尔艇、ash尔许、bsh、ksh等等漓帚,Shell Script大致都類同母债。
由于歷史原因午磁,UNIX系統(tǒng)上有很多種Shell:

  • csh(C Shell):由Bill Joy開發(fā)尝抖,隨BSD UNIX發(fā)布毡们,它的流程控制語句很像C語言,支持很多Bourne Shell所不支持的功能:作業(yè)控制昧辽,命令歷史衙熔,命令行編輯。

  • ksh(Korn Shell):由David Korn開發(fā)搅荞,向后兼容sh的功能红氯,并且添加了csh引入的新功能,是目前很多UNIX系統(tǒng)標準配置的Shell咕痛,在這些系統(tǒng)上/bin/sh往往是指向/bin/ksh的符號鏈接痢甘。

  • tcsh(TENEX C Shell):是csh的增強版本,引入了命令補全等功能茉贡,在FreeBSD塞栅、Mac OS X等系統(tǒng)上替代了csh。

  • bash(Bourne Again Shell):由GNU開發(fā)的Shell腔丧,主要目標是與POSIX標準保持一致放椰,同時兼顧對sh的兼容,bash從csh和ksh借鑒了很多功能愉粤,是各種Linux發(fā)行版標準配置的Shell砾医,在Linux系統(tǒng)上/bin/sh往往是指向/bin/bash的符號鏈接。

可使用cat /etc/shells 指令查看自己系統(tǒng)可以使用的shell種類:

image-20211120231230430.png

用戶的默認 Shell 設置在/etc/passwd文件中衣厘,例如:vim /etc/passwd

image-20211120231337573.png

sh

在 shell 腳本的開頭往往有一句話來定義使用哪種 sh 解釋器來解釋腳本如蚜。
目前常見的 shell 腳本中主要有以下兩種方式:
(1) #!/bin/sh
(2) #!/bin/bash

注意:每個腳本開頭都使用"#!",#!實際上是一個2字節(jié)魔法數(shù)字头滔,這是指定一個文件類型的特殊標記怖亭,在這種情況下,指的就是一個可執(zhí)行的腳本坤检。在#!之后兴猩,接一個路徑名,這個路徑名指定了一個解釋腳本命令的程序早歇,這個程序可以是shell倾芝,程序語言或者任意一個通用程序。
sh是bash的一種特殊的模式箭跳,也就是 /bin/sh 相當于 /bin/bash --posix晨另。說白了sh就是開啟了POSIX標準的bash 。
在一般的linux系統(tǒng)當中(如redhat)谱姓,使用sh調(diào)用執(zhí)行腳本相當于打開了bash的POSIX標準模式
sh一般設成bash的軟鏈:

image-20211120231421597.png

怎么把sh改為指向bash呢借尿?

  • 方法一:直接把/bin/sh的軟鏈接改到bash中,如:ln -s /bin/bash /bin/sh
  • 方法二:配置shell,sudo dpkg-reconfigure dash

dash

鑒于 bash 過于復雜路翻,有人把 bash 從 NetBSD 移植到 Linux 并更名為 dash(Debian Almquist Shell)狈癞,并以獲得更快的腳本執(zhí)行速度。Debian Almquist shell茂契,縮寫為dash蝶桶,一種 Unix shell。它比 Bash 小掉冶,只需要較少的磁盤空間真竖,但是它的對話性功能也較少。它由 NetBSD版本的Almquist shell (ash)發(fā)展而來厌小,于1997年恢共,由赫伯特·許(Herbert Xu)移植到Linux上,于2002年改名為 dash璧亚。

ll -h /bin/

那么怎么把 sh 改為指 dash 呢旁振?

sudo dpkg-reconfigure dash
# 選擇yes使用dash作為默認的shell即可修改為dash。

#!/bin/bash是指此腳本使用 /bin/bash 來解釋執(zhí)行涨岁。其中拐袜,#!是一個特殊的表示符,其后梢薪,跟著解釋此腳本的shell路徑蹬铺。
bash 只是 shell 的一種,還有很多其它 shell秉撇,如:sh,csh,ksh,tcsh,…我們可以通過以下一個示例來進行實驗甜攀,了解#!/bin/bash的使用。
除第一行外琐馆,腳本中所有以“#”開頭的行都是注釋规阀。
1)#!/bin/bash只能放在第一行,如果后面還有#!瘦麸,那么只能看成是注釋谁撼。
這里有三個腳本(腳本都要使用”chmod +x scriptname“命令來獲得可執(zhí)行權(quán)限):

  • tbash1.sh:
#!/bin/sh
source abc
echo “hello abc”
  • tbash2.sh:
#!/bin/bash
source abc
echo “hello abc”
  • tbash3.sh:
source abc
echo “hello abc”

三個腳本執(zhí)行的結(jié)果:

[nsvc@localhost other]$ ./tbash1.sh
./tbash1.sh: line 2: abc: No such file or directory
# 注:當source命令執(zhí)行有問題時,sh不再往下面執(zhí)行滋饲。
[nsvc@localhost other]$ ./tbash2.sh
./tbash2.sh: line 2: abc: No such file or directory
hello abc
# 注:當source命令執(zhí)行有問題時厉碟,bash繼續(xù)執(zhí)行下面命令。
[nsvc@localhost other]$ ./tbash3.sh
./tbash3.sh: line 1: abc: No such file or directory
hello abc
# 注:自身登錄系統(tǒng)所在的shell是bash屠缭。所以箍鼓,當source命令執(zhí)行有問題時,bash繼續(xù)執(zhí)行下面命令呵曹。

如果將 tbash1.sh 改成:

echo “abc”
#!/bin/sh
source abc
echo “hello abc”

那么款咖,執(zhí)行結(jié)果是:

[nsvc@localhost other]$ ./tbash1.sh
abc
./tbash1.sh: line 3: abc: No such file or directory
hello abc
# 也就是說何暮,腳本忽略了第二行“#!/bin/sh",直接使用當前所在的shell(也就是bash)來解釋腳本铐殃。

當把 tbash1.sh 改成:

#!/bin/sh
#!/bin/bash
source abc
echo “hello abc”

執(zhí)行結(jié)果為:

[nsvc@localhost other]$ ./tbash1.sh
./tbash1.sh: line 3: abc: No such file or directory
# 當執(zhí)行完source命令時郭卫,并沒有往下執(zhí)行。說明背稼,#!/bin/sh這一行起到作用了,但#!/bin/bash并沒有起作用玻蝌。在腳本中蟹肘,除第一行外,腳本中所有以“#”開頭的行都是注釋俯树。

2)#!后面的路徑一定要正確帘腹,不正確會報錯。
假如许饿,我們把tbash1.sh中第一行的#!后面加了一個不存在的路徑”/home/sh“:

#!/home/sh
source abc
echo “hello abc”

執(zhí)行結(jié)果為:

[nsvc@localhost other]$ ./tbash1.sh
-bash: ./tbash1.sh: /home/sh: bad interpreter: No such file ordirectory
# 系統(tǒng)會提示/home/sh的路徑不存在阳欲。

3)如果一個腳本在第一行沒有加上#!+shell路徑這一行,那么陋率,腳本會默認當前用戶登錄的shell球化,為腳本解釋器。
在1)中瓦糟,腳本 tbash3.sh 的執(zhí)行結(jié)果筒愚,就是用當前自己登錄的shell(bash)解釋后的結(jié)果。我們通常所用的shell都是bash菩浙,如果哪天登錄到sh巢掺,再使用以上類型的腳本,就會有問題劲蜻。以下是自己登錄到sh下陆淀,執(zhí)行tbash3.sh的結(jié)果:

-sh-3.2$ ./tbash3.sh
./tbash3.sh: line 1: abc: 沒有那個文件或目錄

與1)中的執(zhí)行結(jié)果是不一樣的。
因此先嬉,大家應該養(yǎng)成腳本首行加上#!+shell路徑的習慣轧苫。

4)/bin/sh 相當于 /bin/bash --posix
我們將腳本 tbash1.sh 改為:

#!/bin/bash --posix
source abc
echo “hello abc”

執(zhí)行結(jié)果:

[nsvc@localhost other]$ ./tbash1.sh
./tbash1.sh: line 2: abc: No such file or directory
# 與tbash1.sh原腳本執(zhí)行的結(jié)果一樣。

我們還可以以tbash3.sh為示例疫蔓。
用以下命令來執(zhí)行該腳本:

[nsvc@localhost other]$ bash tbash3.sh
tbash3.sh: line 1: abc: No such file or directory
hello abc
[nsvc@localhost other]$ sh tbash3.sh
tbash3.sh: line 1: abc: No such file or directory
[nsvc@localhost other]$ bash --posix tbash3.sh
tbash3.sh: line 1: abc: No such file or directory

"bash tbash3.sh"表示使用bash來作為腳本解釋器來執(zhí)行tbash3.sh浸剩。同樣,也可以使用如”sh腳本名“這樣的命令鳄袍,來用sh作為腳本解釋器绢要。
從結(jié)果可以看出,/bin/bash–posix/bin/sh的執(zhí)行結(jié)果相同拗小≈刈铮總結(jié)起來,sh跟bash的區(qū)別,實際上是bash有沒開啟posix模式的區(qū)別剿配。遵守posix規(guī)范搅幅,可能包括,”當某行代碼出錯時呼胚,不繼續(xù)往下執(zhí)行茄唐。“

最后加上一點說明蝇更,每個腳本開頭都使用"#!"沪编,#!實際上是一個2字節(jié)魔法數(shù)字,這是指定一個文件類型的特殊標記年扩,在這種情況下蚁廓,指的就是一個可執(zhí)行的腳本。在#!之后厨幻,接一個路徑名相嵌,這個路徑名指定了一個解釋腳本命令的程序,這個程序可以是shell况脆,程序語言或者任意一個通用程序饭宾。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市格了,隨后出現(xiàn)的幾起案子捏雌,更是在濱河造成了極大的恐慌,老刑警劉巖笆搓,帶你破解...
    沈念sama閱讀 207,113評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件性湿,死亡現(xiàn)場離奇詭異,居然都是意外死亡满败,警方通過查閱死者的電腦和手機肤频,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,644評論 2 381
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來算墨,“玉大人宵荒,你說我怎么就攤上這事【秽郑” “怎么了报咳?”我有些...
    開封第一講書人閱讀 153,340評論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀的道長挖藏。 經(jīng)常有香客問我暑刃,道長,這世上最難降的妖魔是什么膜眠? 我笑而不...
    開封第一講書人閱讀 55,449評論 1 279
  • 正文 為了忘掉前任岩臣,我火速辦了婚禮溜嗜,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘架谎。我一直安慰自己炸宵,他們只是感情好,可當我...
    茶點故事閱讀 64,445評論 5 374
  • 文/花漫 我一把揭開白布谷扣。 她就那樣靜靜地躺著土全,像睡著了一般。 火紅的嫁衣襯著肌膚如雪会涎。 梳的紋絲不亂的頭發(fā)上裹匙,一...
    開封第一講書人閱讀 49,166評論 1 284
  • 那天,我揣著相機與錄音在塔,去河邊找鬼。 笑死拨黔,一個胖子當著我的面吹牛蛔溃,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播篱蝇,決...
    沈念sama閱讀 38,442評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼贺待,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了零截?” 一聲冷哼從身側(cè)響起麸塞,我...
    開封第一講書人閱讀 37,105評論 0 261
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎涧衙,沒想到半個月后哪工,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,601評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡弧哎,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,066評論 2 325
  • 正文 我和宋清朗相戀三年雁比,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片撤嫩。...
    茶點故事閱讀 38,161評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡偎捎,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出序攘,到底是詐尸還是另有隱情茴她,我是刑警寧澤,帶...
    沈念sama閱讀 33,792評論 4 323
  • 正文 年R本政府宣布程奠,位于F島的核電站丈牢,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏瞄沙。R本人自食惡果不足惜赡麦,卻給世界環(huán)境...
    茶點故事閱讀 39,351評論 3 307
  • 文/蒙蒙 一朴皆、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧泛粹,春花似錦遂铡、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,352評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至们衙,卻和暖如春钾怔,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背蒙挑。 一陣腳步聲響...
    開封第一講書人閱讀 31,584評論 1 261
  • 我被黑心中介騙來泰國打工宗侦, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人忆蚀。 一個月前我還...
    沈念sama閱讀 45,618評論 2 355
  • 正文 我出身青樓矾利,卻偏偏與公主長得像,于是被迫代替她去往敵國和親馋袜。 傳聞我的和親對象是個殘疾皇子男旗,可洞房花燭夜當晚...
    茶點故事閱讀 42,916評論 2 344

推薦閱讀更多精彩內(nèi)容

  • 自己寫的一個while循環(huán)結(jié)構(gòu)總是報錯,糾結(jié)了一下午欣鳖,各種查資料察皇、改命令行,最后發(fā)現(xiàn)是ubuntu系統(tǒng)解釋器的原因...
    無言89閱讀 28,208評論 0 11
  • 系統(tǒng)內(nèi)核: 讓運算器泽台、控制器什荣、存儲器、輸入/輸出設備等各種硬件設備各司其職且又能協(xié)同運行怀酷。對硬件資源的分配溃睹、調(diào)...
    假正經(jīng)乄閱讀 987評論 0 1
  • 官網(wǎng) 中文版本 好的網(wǎng)站 Content-type: text/htmlBASH Section: User ...
    不排版閱讀 4,367評論 0 5
  • 什么是Shell ? ? 簡單來說Shell其實就是一個命令解釋器,而它的作用就是解釋并執(zhí)行用戶輸入的命令及程序胰坟。...
    Surpassme閱讀 2,708評論 1 24
  • 什么是運維 術語名詞 IDC--(Internet Data Center)互聯(lián)網(wǎng)數(shù)據(jù)中心笔横,主要服務包括整機租用竞滓、...
    lyh165閱讀 2,675評論 0 19