在 ~/.bash_profile 中設置 PATH 與導出 PATH
自定義我的 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 和版本 2 有什麼功能上的區別嗎?
- 3)我應該使用哪個,為什麼?
具體回答您的問題:
export
確實設置了$PATH
明確的。- 否
export
。為子程序設置環境,但$PATH
已為目前環境設置。因此,在第二個範例中,當命令被讀入時 - 並且在export
執行之前 - 目前環境的值 for$PATH
被擴展為$PATH
單詞。- 您應該使用對您來說必要和/或舒適的任何一種。兩者在功能上都沒有任何區別,所以這主要是一個風格問題。
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
再取消設置它 - 它也可以作為函式工作。但是 subshells 無論如何都會自動繼承變數值,所以:
var1=value ( echo "$(echo "$var1")" ) value
export
在這種情況下沒有區別。但是,如果您的腳本呼叫另一個腳本或任何其他解釋您已
export
編輯的值的執行檔並且您停止export
它們,那麼這些值將不再在它們的環境中可用。在下面的範例中,我使用 shell 變數$PS1
(定義互動式 shell 提示的內容)來展示export
ed 變數的變化如何影響子程序。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