Bash

在 ~/.bash_profile 中設置 PATH 與導出 PATH

  • June 23, 2014

自定義我的 bash 配置文件時有什麼區別,哪個更好用?該命令的文件export很少,因為它是一個內置的 cmd。

摘自我的 ~/.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版本 1env中的相同。也相同。

所以:

  • 1)使用export與明確設置 PATH 有什麼好處?
    1. 應用時版本 1 和版本 2 有什麼功能上的區別嗎?
  • 3)我應該使用哪個,為什麼?

具體回答您的問題:

  1. export 確實設置了$PATH明確的。
  2. export。為子程序設置環境,但$PATH已為目前環境設置。因此,在第二個範例中,當命令被讀入時 - 並且 export執行之前 - 目前環境的值 for$PATH被擴展為$PATH單詞。
  3. 您應該使用對您來說必要和/或舒適的任何一種。兩者在功能上都沒有任何區別,所以這主要是一個風格問題。

POSIX 如此定義export內置函式:

shell 應將export屬性賦予與指定名稱對應的變數,這將使它們處於隨後執行的命令的環境中。如果變數的名稱後跟*= word*,則該變數的值應設置為word

從我的另一個答案

聲明 shell 變數和環境變數之間幾乎沒有區別。因為 export 是內置的,所以它為下一個呼叫的程序聲明了一個環境變數,但是如果你不呼叫一個,那麼這個程序仍然是 shell,所以你的變數會被計算兩次。

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

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

相反,只需使用:

set -a 

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

但是 subshel​​ls 無論如何都會自動繼承變數值,所以:

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

引用自:https://unix.stackexchange.com/questions/138504