自訂 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
。
所以:
export
1)使用PATH 與明確設定 PATH 相比有什麼好處?- 2)版本1和版本2在應用時有功能上的差異嗎?
- 3)我該使用哪一個,為什麼?
答案1
具體回答你的問題:
export
做明確設定$PATH
。No.
export
為子進程設定環境,但$PATH
已經為目前環境設定。因此,在第二個範例中,當讀入命令時 - 並且前export
被執行 - 當前環境的值$PATH
被擴展為$PATH
單字。您應該使用您認為必要和/或舒適的任何一種。兩者在功能上都沒有任何區別,所以這主要是風格問題。
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 提示的內容)來示範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
對其進行設置,但這不是可移植的行為。
答案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