0
我有2個腳本:bash腳本輸出/源怪異行爲
腳本:script1.sh
#!/bin/bash [[ $0 = "$BASH_SOURCE" ]] && { echo "You must source me!"; exit; } if [ -z ${I} ]; then echo echo -n "some string: " stty -echo read I #export I stty echo echo else echo "ALREADY SET!!!" fi echo "--- $I"
腳本:script2.sh
#!/bin/bash echo "--- $I" if [ -z $I ]; then echo "VARIABLE NOT SET" else echo "VARIABLE SET" fi
而現在,弄得我...我第一次運行SCRIPT1然後SCRIPT2部分...
第一種方案:
正如你可以看到我可以打印$ I變量(值:ASD)內部腳本1。當我運行SCRIPT2它返回「變量未設置」,但是當我嘗試回聲$ II獲得「ASD」
[email protected]:~$ . ./script1.sh
some string:
--- asd
[email protected]:~$ ./script2.sh
---
VARIABLE NOT SET
[email protected]:~$ echo $I
asd
[email protected]:~$
第二種情況:
現在我去掉#export I
並重新運行這兩個腳本作爲前(重新運行之前,我創建了一個新的會話,以便所有變量將重設)
在這種情況下,我可以讀$我在SCRIPT2和回聲它
[email protected]:~$ . ./script1.sh
some string:
--- asd
[email protected]:~$ ./script2.sh
--- asd
VARIABLE SET
[email protected]:~$ echo $I
asd
有人可以解釋我爲什麼在我的第一個場景中可以回顯$ I,但是我不能在第二個腳本中使用它?
感謝您的解釋......但爲什麼我可以從提示符回顯它? – Wolfy
因爲「prompt」*是當前shell。 –
Absurdly minor nit。事實證明,「出口」並不一定會將變量轉移到環境中。在bash中它確實存在,但通常它只能確保變量將處於所有子進程的環境中。爲什麼任何shell都會選擇以任何其他方式來實現這種行爲,而不是簡單地把變量放在環境中是令人困惑的,但是'dash'至少選擇不這樣做。 (或者在我檢查過的最後一個版本中,這是幾年前。) –