Zsh

新的 tmux 會話僅來源 .zshrc,並且不獲取 .profile 中定義的 $PATH

  • October 20, 2018

在閱讀了有關該主題的多個問題後,我仍然感到迷茫。我讀到建議應該設置環境變數,包括$PATHin.profile而不是專門 in .bashrcor .zshrc,這就是我所做的。

我的預設 shell 是zsh並且我已經設置set-option -g default-shell $SHELLtmux.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.

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