Linux shell語(yǔ)言——dash和bash

自己寫的一個(gè)while循環(huán)結(jié)構(gòu)總是報(bào)錯(cuò),糾結(jié)了一下午,各種查資料、改命令行,最后發(fā)現(xiàn)是ubuntu系統(tǒng)解釋器的原因,腳本沒(méi)有問(wèn)題,換一下解釋器就OK了。郁卒的要死……


Ubuntu 的 bash和dash的區(qū)別


什么是bash ?

Bash(GNU Bourne-Again Shell)是許多Linux平臺(tái)的內(nèi)定Shell,事實(shí)上,還有許多傳統(tǒng)UNIX上用的Shell,像tcsh、csh、ash、bsh、ksh等等。

GNU/Linux 操作系統(tǒng)中的 /bin/sh 本是 bash (Bourne-Again Shell) 的符號(hào)鏈接,但鑒于 bash 過(guò)于復(fù)雜,有人把 bash 從 NetBSD 移植到 Linux 并更名為 dash (Debian Almquist Shell),并建議將 /bin/sh 指向它,以獲得更快的腳本執(zhí)行速度。Dash Shell 比 Bash Shell 小的多,符合POSIX標(biāo)準(zhǔn)。

Debian和Ubuntu中,/bin/sh默認(rèn)已經(jīng)指向dash,這是一個(gè)不同于bash的shell,它主要是為了執(zhí)行腳本而出現(xiàn),而不是交互,它速度更快,但功能相比bash要少很多,語(yǔ)法嚴(yán)格遵守POSIX標(biāo)準(zhǔn)。

就是這個(gè)倒霉的dash解釋器使得我按照bash語(yǔ)法寫的shell 腳本不能運(yùn)行。

要知道自己的/bin/sh指向何種解釋器,可以用 ls /bin/sh -al 命令查看:

? ? ? ? $ ls /bin/sh -al

? ? ? ? lrwxrwxrwx 1 root root 4 11月 16 15:33 /bin/sh -> bash

以上結(jié)果就表示當(dāng)前系統(tǒng)用的是dash解釋器。

切換到bash的方式其實(shí)挺簡(jiǎn)單的,關(guān)鍵是一直沒(méi)找出這個(gè)原因……

修改默認(rèn)的sh,可以采用命令sudo dpkg-reconfigure dash

會(huì)出現(xiàn)一個(gè)圖片狀的配置菜單,選no就可以了

再次檢查一下, ls /bin/sh -al 發(fā)現(xiàn)軟鏈接指向/bin/bash

? ? ? ? ?lrwxrwxrwx 1 root root 4 11月 16 15:33 /bin/sh -> bash

參考資料:Ubuntu 的 bash和dash的區(qū)別_Linux教程_Linux公社-Linux系統(tǒng)門戶網(wǎng)站

感謝度娘??!

注:dash 和 bash 語(yǔ)法上的主要的區(qū)別有:

1.定義函數(shù)

bash: function在bash中為關(guān)鍵字

dash: dash中沒(méi)有function這個(gè)關(guān)鍵字

2.select var in list; do command; done

bash:支持

dash:不支持, 替代方法:采用while+read+case來(lái)實(shí)現(xiàn)

3. echo {0..10}

bash:支持{n..m}展開(kāi)

dash:不支持,替代方法, 采用seq外部命令

4. here string

bash:支持here string

dash:不支持, 替代方法:可采用here documents

5. >&word重定向標(biāo)準(zhǔn)輸出和標(biāo)準(zhǔn)錯(cuò)誤

bash: 當(dāng)word為非數(shù)字時(shí),>&word變成重定向標(biāo)準(zhǔn)錯(cuò)誤和標(biāo)準(zhǔn)輸出到文件word

dash: >&word, word不支持非數(shù)字, 替代方法: >word 2>&1; 常見(jiàn)用法 >/dev/null 2>&1

6. 數(shù)組

bash: 支持?jǐn)?shù)組, bash4支持關(guān)聯(lián)數(shù)組

dash: 不支持?jǐn)?shù)組,替代方法, 采用變量名+序號(hào)來(lái)實(shí)現(xiàn)類似的效果

7. 子字符串?dāng)U展

bash: 支持${parameter:offset:length},${parameter:offset}

dash: 不支持, 替代方法:采用expr或cut外部命令代替

8. 大小寫轉(zhuǎn)換

bash: 支持${parameter^pattern},${parameter^^pattern},${parameter,pattern},${parameter,,pattern}

dash: 不支持,替代方法:采用tr/sed/awk等外部命令轉(zhuǎn)換

9. 進(jìn)程替換<(command), >(command)

bash: 支持進(jìn)程替換

dash: 不支持, 替代方法, 通過(guò)臨時(shí)文件中轉(zhuǎn)

10. [ string1 = string2 ] 和 [ string1 == string2 ]

bash: 支持兩者

dash: 只支持=

11. [[ 加強(qiáng)版test

bash: 支持[[ ]], 可實(shí)現(xiàn)正則匹配等強(qiáng)大功能

dash: 不支持[[ ]], 替代方法,采用外部命令

12. for (( expr1 ; expr2 ; expr3 )) ; do list ; done

bash: 支持C語(yǔ)言格式的for循環(huán)

dash: 不支持該格式的for, 替代方法,用while+$((expression))實(shí)現(xiàn)

13. let命令和((expression))

bash: 有內(nèi)置命令let, 也支持((expression))方式

dash: 不支持,替代方法,采用$((expression))或者外部命令做計(jì)算

14. $((expression))

bash: 支持id++,id--,++id,--id這樣到表達(dá)式

dash: 不支持++,--, 替代方法:id+=1,id-=1, id=id+1,id=id-1

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容