新的 tmux 会话仅来源 .zshrc,并且不获取 .profile 中定义的 $PATH

新的 tmux 会话仅来源 .zshrc,并且不获取 .profile 中定义的 $PATH

在阅读了有关该主题的多个问题后,我仍然感到失落。我读到建议,应该设置环境变量,包括$PATHin.profile而不是专门 in .bashrcor .zshrc,这就是我所做的。

我的默认 shell 是zsh并且我已设置set-option -g default-shell $SHELLtmux.conf.

然而,现在每当我启动 tmux 会话时,它显然不会接受任何修改,$PATH并且仅接受源.zshrc。我当前的解决方法是source ~/.profile在 的末尾添加.zshrc,我认为这是不正确的做法。

这个帖子表示 tmux/screen 通常作为子 shell 而不是登录 shell 运行,因此不一定是 source .profile。然而,另一篇文章声称,如果你可以logout在 shell 中运行,那么它就是一个登录 shell,我确实能够做到。许多帖子还声称tmux应该寻找.bash_profile .profile,但会忽略.bashrc,这显然不是我的 zsh 等效项中发生的情况。

毕竟,将 tmux 与 zsh 结合使用并让它正确获取环境变量的最佳实践是什么?

答案1

您所描述的行为是预期的行为。环境变量在 中定义.profile,在您登录时读取。启动新的 tmux 会话不会让您登录。Tmux 默认情况下会启动登录 shell,但您已在配置中将其关闭,因此 tmux 窗口只是继承外界环境。

如果您输入source .profile.zshrc这将覆盖 shell 运行的任何环境。这意味着您无法在默认环境之外的环境中运行 shell,例如尝试使用不同的PATH.

只需source .profile从 中删除.zshrc。您将在所有 shell 中拥有在登录时设置的默认环境。

如果您的登录 shell 是 zsh,请注意它.zprofile在登录时读取,而不是.profile.这与 bash 不同,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

答案2

你应该删除你的set-option -g default-shell $SHELLfrom .tmux.conf;这不是必需的,因为默认情况下tmux会使用SHELLenvvar。

联机帮助页是这样说的:

     default-shell path
             Specify the default shell.  This is used as the login
             shell for new windows when the default-command option is
             set to empty, and must be the full path of the exe-
             cutable.  When started tmux tries to set a default value
             from the first suitable of the SHELL environment vari-
             able, the shell returned by getpwuid(3), or /bin/sh.
             This option should be configured when tmux is used as a
             login shell.

tmux~/.profile默认情况下将启动一个登录 shell(即正在获取或~/.zprofile- 和/~/.zlogout~/.bash_logout退出之前的shell ):

     default-command shell-command
             Set the command used for new windows (if not specified
             when the window is created) to shell-command, which may
             be any sh(1) command.  The default is an empty string,
             which instructs tmux to create a login shell using the
             value of the default-shell option.

这里关于这种行为的讨论 - 这是相当令人惊讶的,并且与 的行为不同screen

所以,如果你想tmux开始一个-使用默认 shell 登录 shell,将以下内容放入您的~/.tmux.conf

set -g default-command $SHELL

如果您希望它使用默认 shell 之外的另一个 shell 来运行登录 shell:

set -g default-command "/alternative/sh -l"

相关内容