2012-09-24 62 views

回答

14

每一道工序,即使是在Windows,具有記憶被稱爲環境塊塊,這包含環境變量。當創建新進程時,默認情況下,父進程的環境塊被複制到子進程,因此環境變量是將文本數據傳遞給子進程的簡單方法。

export命令創建一個環境變量,或將普通的局部變量轉換爲環境變量。在C-shell中,其少數幾個優點之一就是它對環境變量(setenv)使用不同的語法來對本地變量(set)進行語法分析。 Bourne殼衍生物,如Bash和Korn殼,隱藏了所有這些。

目前,只有簡單的值可以傳遞,所以像數組這樣的項目不被支持(它只是導出第一個元素)。除非子進程是相同類型的shell(即bash的另一個實例),否則也不會導出使用define設置的變量屬性。這也適用於導出的函數,雖然有時可能在不同類型的殼之間破解它(使用eval)。

在Bash(和其他)中有一個叫做allexport的shell設置,這意味着所有變量都是環境變量 - 可能通常是一個糟糕的主意。您可以使用execve之類的語言(如C語言)提供不同的environemnt塊,但從shell中需要一個程序,如env,有關詳細信息,請參閱man env

34

export使變量可用於子過程。

也就是說,如果您從腳本產生一個新的進程,變量k將不可用於該子進程,除非您使用export它。請注意,如果在子流程中更改此變量,將不會在父流程中可見

有關更多詳細信息,請參見this doc的第3.2.3節。

+0

簡明扼要。 +1 –

18

我創建了一個簡單的腳本以示區別:

$ cat script.sh 
echo $answer 

讓我們來測試不export

$ answer=42 
$ ./script.sh 

$ . script.sh 
42 

值只知道如果使用的是相同過程中執行腳本(即相同的bash實例,使用source/.

現在,使用export

$ export answer=42 
$ ./script.sh 
42 
$ . script.sh 
42 

的值是已知的子進程。

因此,如果你想讓子流程知道變量的值,那麼你應該使用export

相關問題