2013-11-25 43 views
0

我有一個Ubuntu機設置來砸默認的shell和$ PATH兩種方式二進制:爲什麼bash的行爲不同,當它被稱爲sh?

$ which bash 
/bin/bash 
$ which sh 
/bin/sh 
$ ll /bin/sh 
lrwxrwxrwx 1 root root 4 Mar 6 2013 /bin/sh -> bash* 

但是,當我嘗試調用使用the inline file descriptor(僅Bash可以處理,但沒有一個腳本SH)兩個調用不同的表現:

$ . ./inline-pipe 
reached 
$ bash ./inline-pipe 
reached 
$ sh ./inline-pipe 
./inline-pipe: line 6: syntax error near unexpected token `<' 
./inline-pipe: line 6: `done < <(echo "reached")' 

示例腳本我指的是看起來像

#!/bin/sh 
while read line; do 
if [[ "$line" == "reached" ]]; then echo "reached"; fi 
done < <(echo "reached") 

現實一個是一點點長:

#!/bin/sh 
declare -A elements 
while read line 
do 
    for ele in $(echo $line | grep -o "[a-z]*:[^ ]*") 
    do 
     id=$(echo $ele | cut -d ":" -f 1) 
     elements["$id"]=$(echo $ele | cut -d ":" -f 2) 
    done 
done < <(adb devices -l) 
echo ${elements[*]} 
+0

用shebang(#!/ ...)看到實際的腳本 - 特別是引導線會很有幫助。其次,你現在用哪個「$」提示符運行哪個shell? – Daniel

+0

SRY,我認爲這很清楚。它運行在默認shell(按照我的第一句話)bash。也會上傳腳本。 – fragmentedreality

+2

http://www.gnu.org/software/bash/manual/bashref.html#Bash-POSIX-Mode –

回答

3

bash被調用爲sh時,它(主要)會將自己限制爲POSIX標準中的特徵。流程替換不是這些功能之一,因此是錯誤。

+0

是的,引用標準總是非常有力的論據來摧毀一些東西,這些標準更好。特別是對於由_committee_「發明」的標準。 – peterh

+1

@MaXX我不知道我理解你的觀點。 – chepner

+0

請嘗試解釋哪些不夠明確。 – peterh

-2

我相信sh在Ubuntu其實是dash比功能較少的bash較小。

+2

該OP顯然已重置'/ bin/sh'再次指向'bash'。 – chepner

0

理論上來說,它是bash的一個功能:如果您調用爲「sh」,則默認關閉其所有功能。而root shell默認是「/ bin/sh」。

其主要目標是安全性。次要的是在系統的某些shell之間產生某種程度的兼容性,因爲它使得系統腳本能夠以交替(更快更安全)的環境運行。

這是理論。

實際上這樣做是因爲開發團隊中總是有人想要通過各種論證(安全性,簡單性,安全性和穩定性)來減少和消除所有事情 - 但這些論點總是朝着刪除,刪除,銷燬)。

這是因爲debian中的bash沒有網絡套接字,這是因爲debian在20年內無法正常整合最佳壓縮器(bz2,xz) - 這是因爲根shell是默認如此簡單,就像八十年代的PDP11一樣。

+1

恐怕您錯過了標準的主要用途,特別是Unix/POSIX。在這種情況下,**允許**開發人員創建可在兼容平臺之間移植的腳本。沒有隱藏的議程。 – jlliagre

+0

我希望你有權利,但我已經這麼多了。特別是從bash中刪除網絡,gzip debs使我的觀點如現在這樣。 – peterh

+0

當前和以前的Debian版本都在bash中啓用了網絡支持,並且在POSIX模式下運行bash時此功能未被禁用。我沒有看到gzipped debs如何與bash/sh行爲或POSIX標準相關。 – jlliagre