2014-01-19 199 views
0

導出的環境變量與環境變量有什麼區別?導出的環境變量與環境變量

我有一個問題回答「我們怎樣才能顯示在終端中定義的所有環境變量?」

首先,我認爲這是「printenv」,但隨後又表示「定義在終端」和我認爲這意味着我讀過的導出的環境變量用「env」顯示。

我有點困惑。

回答

1

export是創建環境變量的命令。短語「導出的環境變量」是多餘的。

shell可能有一些環境變量不是使用export命令創建的,因爲每個程序都是以調用程序通過execve系統調用傳遞的環境開始的,所以我想你可以說有一些環境從未「導出」的變量。

但這是一個愚蠢的區別。 shell不會跟蹤其環境變量的歷史來源。沒有辦法讓它告訴你哪些是「在終端中定義的」。它不知道。 (history | grep export?呃......)

爲了迴應Charles Goodwin的回答,unix中沒有「永久」環境變量。可以通過在shell啓動文件(/etc/profile,$HOME/.profile等)中定義一個定義來創建持久變量的錯覺,但該定義將是一個export命令,與您手動運行的命令export無法區分。

在某些系統上,存在一個/etc/environment文件,該文件創建了一組「共享,持久」環境變量的更強大的幻想,但實際上它們都不是。它不包含export關鍵字,因爲它沒有被shell解析 - 在啓動shell之前,PAM會處理它。這與/etc/profile的原理相同,但是 - 每次登錄時都必須將文件讀入初始進程的環境中。通過嘗試對另一個進程進行「修改並檢入另一個進程」實驗,您可以看到這些值不是共享的來自/ etc/environment,甚至修改/etc/environment文件並檢查對已存在進程的影響 - 不會有任何影響。

環境可以更準確地稱爲「遺傳變量」 - 信息從父母到孩子只通過它們的一種方式流動。改變術語有點太晚了。

0

可能會在不同的操作系統之間有所不同,但我的理解是導出的變量僅適用於該會話(即打開終端,導出環境變量,打開另一個終端並且未在新終端上設置導出的env),而環境變量持久性(會話之間,重新啓動等)。根據不同類型的env如何應用於應用程序,我沒有意識到任何(除非你想要導出的env應用,那麼你必須在運行應用程序之前將其導出)。