在阅读了有关该主题的多个问题后,我仍然感到失落。我读到建议,应该设置环境变量,包括$PATH
in.profile
而不是专门 in .bashrc
or .zshrc
,这就是我所做的。
我的默认 shell 是zsh
并且我已设置set-option -g default-shell $SHELL
为tmux.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 $SHELL
from .tmux.conf
;这不是必需的,因为默认情况下tmux
会使用SHELL
envvar。
联机帮助页是这样说的:
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"