tmux 是否对 PATH 变量进行“排序”?

Rob*_*ino 19 tmux

我有一个可重现的问题:

  1. 在 Bash .profile 中设置我的 PATH
  2. 启动TMUX通过tmuxtmux attach或任何变体
  3. echo $PATH 并使用相同的组件查看它,但顺序不同

如何阻止这个?怎么解释呢?

小智 42

如果您使用的是 Mac 并且一直想知道为什么/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin在运行 tmux 时总是预先添加到 PATH,那是因为从您的/etc/profile文件运行了一个名为 path_helper 的实用程序。

您不能轻易说服 tmux(或者更确切地说,bash)不使用源/etc/profile(出于某种原因,tmux 总是作为登录 shell 运行,这意味着 /etc/profile 将被读取),但是您可以确保 path_helper 的效果不不要搞砸你的路径。

诀窍是在 path_helper 运行之前确保 PATH 为空。在我的~/.bash_profile文件中,我有这个:

if [ -f /etc/profile ]; then
    PATH=""
    source /etc/profile
fi
Run Code Online (Sandbox Code Playgroud)

在 path_helper 执行之前清除 PATH 将阻止它将默认 PATH 预先添加到您(以前)选择的 PATH,并允许您的其余个人 bash 设置脚本(命令进一步向下.bash_profile,或者.bashrc如果您从 中获取它.bash_profile)来设置您的PATH 相应。

希望这是有道理的...

  • 如果你不想弄乱系统默认设置,`.tmux.conf` 中的 `set -g default-command "${SHELL}"` 会强制 tmux 使用非登录 shell。无论如何,我不认为这些有什么意义,因为你通常在登录后打开 tmux。 (4认同)

use*_*686 6

不; 排序$PATH将是一件太疯狂的事情,因为许多系统依赖于其用户设置的顺序。

但是,tmux确实在“登录”模式下启动您的 shell,从而导致再次~/.profile采购。这意味着如果你在那个文件中有类似的东西,它会再次完成,导致 $PATH 包含. 为避免这种情况,您可以使用另一个变量来检查:PATH=/my/dir:/another/dir:$PATH/my/dir:/another/dir:/my/dir:/another/dir:(etc.)

if [ "$_SKIP_PROFILE" ]; then
    return 0
else
    export _SKIP_PROFILE=y
fi

export PATH="/my/dir:/another/dir:$PATH"
Run Code Online (Sandbox Code Playgroud)