2016-09-28 58 views
0

我有2個腳本:bash腳本輸出/源怪異行爲

  1. 腳本: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" 
    
  2. 腳本: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,但是我不能在第二個腳本中使用它?

回答

2

因爲您沒有導出它。導出變量會將其從當前shell的變量列表移到環境中。子進程只從環境讀取現有變量。

+0

感謝您的解釋......但爲什麼我可以從提示符回顯它? – Wolfy

+0

因爲「prompt」*是當前shell。 –

+0

Absurdly minor nit。事實證明,「出口」並不一定會將變量轉移到環境中。在bash中它確實存在,但通常它只能確保變量將處於所有子進程的環境中。爲什麼任何shell都會選擇以任何其他方式來實現這種行爲,而不是簡單地把變量放在環境中是令人困惑的,但是'dash'至少選擇不這樣做。 (或者在我檢查過的最後一個版本中,這是幾年前。) –