新的 tmux 會話僅來源 .zshrc,並且不獲取 .profile 中定義的 $PATH
在閱讀了有關該主題的多個問題後,我仍然感到迷茫。我讀到建議應該設置環境變數,包括
$PATH
in.profile
而不是專門 in.bashrc
or.zshrc
,這就是我所做的。我的預設 shell 是
zsh
並且我已經設置set-option -g default-shell $SHELL
了tmux.conf
.但是,現在每當我啟動 tmux 會話時,它顯然不會接受任何修改,
$PATH
而只接受 source.zshrc
。我目前的解決方法是source ~/.profile
在末尾添加.zshrc
,我認為這不是正確的做法。這篇文章表明 tmux/screen 通常作為子 shell 而不是登錄 shell 執行,因此不一定是 source
.profile
。然而,另一篇文章聲稱,如果你可以logout
在 shell 中執行,它就是一個登錄 shell,我確實能夠做到。許多文章還聲稱tmux
應該尋找.bash_profile
plus.profile
,但會忽略.bashrc
,這顯然不是在我的 zsh 等效情況下發生的情況。畢竟,將 tmux 與 zsh 一起使用並讓它正確獲取環境變數的最佳實踐是什麼?
您描述的行為是預期的行為。環境變數在 中定義
.profile
,在您登錄時讀取。啟動新的 tmux 會話不會讓您登錄。預設情況下,Tmux 會啟動登錄 shell,但您在配置中已將其關閉,因此 tmux 視窗只是繼承外部環境。如果你放入
source .profile
你的.zshrc
,這會覆蓋 shell 執行的任何環境。這意味著你不能在與預設環境不同的環境中執行 shell,例如嘗試使用不同的PATH
.只需
source .profile
從.zshrc
. 您將在所有 shell 中擁有在登錄時設置的預設環境。如果您的登錄 shell 是 zsh,請注意它
.zprofile
在登錄時讀取,而不是.profile
. 這與 bash 不同,.profile
如果沒有.bash_profile
. zsh的工作方式不同,因為它的語法和sh不同,所以不能.profile
直接讀取。如果您想要一個.profile
在 sh 下用於 GUI 登錄的文件,並且還對文本模式登錄使用相同的文件,並且您已將 zsh 設置為您的登錄 shell,則使用以下行作為您的~/.zprofile
:emulate sh -c 'source ~/.profile'
如果 tmux 配置為執行登錄 shell,則所有 tmux 視窗將覆蓋周圍環境而不是繼承它。這意味著如果您在 tmux 之外定義新變數,您仍然會在 tmux 會話中擁有它們,但是如果您更改已定義的變數的值,那麼您的更改將在 tmux 中失去。總而言之,tmux 的預設行為沒有多大意義。避免這一點
set-option -g default-command $SHELL
是~/.tmux.conf
.如果您使用 tmux 作為“新登錄”的一種方式,您可能更願意讓每個視窗在新環境中執行。如果是這樣,那麼你可能應該用類似的東西清理你的環境
set-option -g default-command env -i USER="$USER" LOGNAME="$LOGNAME" $SHELL
請記住,如果您的登錄 shell 是 zsh,那麼它會讀取
.zprofile
,而不是.profile
.