在阅读了有关该主题的多个问题后,我仍然感到迷茫。我读到建议应该设置环境变量,包括$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
:如果 tmux 配置为运行登录 shell,则所有 tmux 窗口将覆盖周围环境而不是继承它。这意味着如果您在 tmux 之外定义新变量,您仍然会在 tmux 会话中拥有它们,但是如果您更改已定义的变量的值,那么您的更改将在 tmux 中丢失。总而言之,tmux 的默认行为没有多大意义。避免这一点
set-option -g default-command $SHELL
是~/.tmux.conf
.如果您使用 tmux 作为“新登录”的一种方式,您可能更愿意让每个窗口在新环境中运行。如果是这样,那么你可能应该用类似的东西清理你的环境
请记住,如果您的登录 shell 是 zsh,那么它会读取
.zprofile
,而不是.profile
.你应该删除你的
set-option -g default-shell $SHELL
from.tmux.conf
; 这不是必需的,因为默认情况下tmux
会使用SHELL
envvar。这是手册页所说的:
tmux
默认情况下,将启动一个登录 shell(即,正在获取~/.profile
或~/.zprofile
-- 和~/.zlogout
或~/.bash_logout
之前退出的 shell):有关此行为的讨论,请参见此处——这非常令人惊讶,并且与
screen
.因此,如果您想使用默认 shell
tmux
启动非登录 shell,请将以下内容放入您的~/.tmux.conf
:如果您希望它使用另一个 shell 而非默认 shell 运行登录 shell: