2012-01-27 92 views
2

我在/bin已成立這樣的UNIX環境中工作訪問時忽略BASH_ENV:慶典似乎通過一個符號

-rwxr-xr-x 1 root root 617144 Nov 19 2009 bash 
lrwxrwxrwx 1 root root  4 Nov 23 2010 sh -> bash 

在我的環境我已經設置$BASH_ENV指向我的地方。 bashrc中:

env | grep BASH 
BASH_ENV=/home/users/atomicpirate/.bashrc 

此外,.bashrc中具有作爲其第一行echo BASHRC READ

我希望/ bin/sh的和/斌/慶典的行爲與此設置完全一樣的...但他們不這樣做:

/bin/bash -c 'echo $BASH_ENV' 
BASHRC READ 
/home/users/atomicpirate/.bashrc 

/bin/sh -c 'echo $BASH_ENV' 
/home/users/atomicpirate/.bashrc 

在第二種情況下,.bashrc中是不讀。任何想法爲什麼會這樣?看起來像符號鏈接正在打破$ BASH_ENV的預期行爲。

回答

6

報價bash manpage

如果bash以名稱sh啓動,它試圖儘可能接近模仿的sh 歷史版本的啓動行爲成爲可能, 同時符合 POSIX標準。 。

注意,當交互式shell中運行,現代sh類似bash使用$BASH_ENV的方式的方式使用$ENV。這種行爲也是由bash模仿的。

+0

這是關於'$ ENV'的一個有趣的地方,我不知道'sh'有''bash'的'$ BASH_ENV'類似的環境變量。謝謝! – atomicpirate 2012-01-27 16:10:55

+0

進一步研究一下,'sh'只使用'$ ENV'作爲交互式shell,而bash使用'$ BASH_ENV'作爲交互式和非交互式shell。所以,在上面的例子中,使用'$ ENV'不會改變結果。仍然很好意識到。 – atomicpirate 2012-01-27 16:49:05

+0

感謝您指出這一點。我已經更新了答案。請注意,「sh」行爲隨着時間顯着變化。下面是FreeBSD sh手冊頁的摘錄:「與舊版本的sh不同,ENV腳本只是在調用交互式shell的時候才提供的,這關閉了一個衆所周知的,有時很容易被利用的安全漏洞,與安全性不高的ENV腳本相關。 – 2012-01-27 16:57:06

3

bash被調用爲sh時,它故意表現不同,並且禁用了一些bash擴展。

看起來,其中一個變化是它不再讀取由$BASH_ENV指定的文件。你可以通過將文件製作成普通文件(暫時)並且看到與普通文件相同的行爲來證明它與符號鏈接無關。

+1

您是對的 - 它與符號鏈接無關,只是與名稱有關shell被調用時。沒有意識到這種行爲 - 謝謝! – atomicpirate 2012-01-27 16:01:42