設定 PATH 與在 ~/.bash_profile 中匯出 PATH

設定 PATH 與在 ~/.bash_profile 中匯出 PATH

自訂 bash 設定檔時有什麼區別以及哪個更好?有關該命令的文檔export很少,因為它是內建命令。

摘自我的 ~/.bash_profile 版本 1:

#PATH
export PATH=/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin:$HOME/bin

#add Homebrew’s sbin to PATH
export PATH=/usr/local/sbin:$PATH

輸出來自:echo $PATH /usr/local/sbin:/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin:/Users/njboot/bin

版本 2 摘錄:

#PATH
PATH=/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin:$HOME/bin

#add Homebrew’s sbin to PATH
export PATH=/usr/local/sbin:$PATH

輸出echo $PATH與版本 1 相同env

所以:

  • export1)使用PATH 與明確設定 PATH 相比有什麼好處?
  • 2)版本1和版本2在應用時有功能上的差異嗎?
  • 3)我該使用哪一個,為什麼?

答案1

具體回答你的問題:

  1. export 明確設定$PATH

  2. No.export為子進程設定環境,但$PATH已經為目前環境設定。因此,在第二個範例中,當讀入命令時 - 並且 export被執行 - 當前環境的值$PATH被擴展為$PATH單字。

  3. 您應該使用您認為必要和/或舒適的任何一種。兩者在功能上都沒有任何區別,所以這主要是風格問題。

POSIX 定義了export內建所以:

shell 應將export屬性賦予與指定名稱相對應的變量,這將使它們處於隨後執行的命令的環境中。如果變數名後面跟著= 字,那麼該變數的值應設定為單字

來自我的另一個答案:

聲明 shell 變數和環境變數之間沒有什麼區別。因為導出是一個內建函數,所以它為下一個呼叫的進程聲明了一個環境變量,但如果您不呼叫該進程,該進程仍然是 shell,因此您的變數會被計算兩次。

只要您不使用export兩次評估,您就可以刪除所有匯出,而不會對導出的變數產生任何影響。兩次評估我的意思是:

var1=var2 
export "${var1}=var3"
echo "$var2"
var3

相反,只需使用:

set -a 

....在腳本的頂部。此後定義的所有變數都將自動exported- 其中包括您以前可能沒有export編輯過的變數。或者,您可以只set -a使用腳本的一部分,然後set +a取消設定它 - 它也可以作為函數使用。

但子 shell 無論如何都會自動繼承變數值,所以:

var1=value
( echo "$(echo "$var1")" )
value

export在這種情況下沒有什麼區別。

但是,如果您的腳本呼叫另一個腳本或解釋您編輯的值的任何其他可執行文件,export並且您停止使用export它們,那麼這些值將不再在其環境中可用。在下面的範例中,我使用 shell 變數$PS1(定義互動式 shell 提示的內容)來示範exported 變數的變更如何影響子進程。

export PS1="$(printf "this is another executable\n > ")"
echo exit | sh -i

###OUTPUT###

this is another executable
 > exit
exit

但 ...

PS1="$(printf "this is another executable\n > ")"
echo exit | sh -i

###OUTPUT###

sh-4.3$ exit
exit

但話又說回來,如果您在呼叫進程時明確聲明環境變數......

PS1="$(printf "this is another executable\n > ")"
{
echo exit | PS1=$PS1 sh -i
echo exit | sh -i
}

###OUTPUT###

this is another executable
 > exit
exit
sh-4.3$ exit
exit

任何ENV首先由 shell 呼叫的檔案(例如.bashrc或 ).profile都會在該 shell 的生命週期內設定變數值。因此,export在這些檔案中設定和編輯的任何變數都會保持該export特徵,並export在 shell 的生命週期內或直到它們被呼叫之前,被該 shell 呼叫的所有子進程使用unset

不過,值得注意的是,它在某種程度上bash擴展了export內建函數以包含該-n選項 - 該選項使您能夠export從變數中刪除屬性而無需unset對其進行設置,但這不是可移植的行為。

答案2

這是一個類似的線程

簡短的回答:

https://superuser.com/a/153378/333431

導出的變數會傳遞給子進程,而未導出的變數則不會。

export這表示如果您打算在子 shell 中使用變量,則應該使用變數。

你可以測試一下:

$ TEST="im_not_here"
$ echo $TEST
im_not_here
$ bash -c 'echo $TEST'
<empty output>
$ export TEST2="im_here"
$ echo $TEST2
im_here
$ bash -c 'echo $TEST2'
im_here

相關內容