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


14

我有一个可重现的问题:

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

如何停止呢?是什么原因呢?

Answers:


29

如果您使用的是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无关。

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

if [ -f /etc/profile ]; then
    PATH=""
    source /etc/profile
fi

在path_helper执行之前清除PATH可以防止将默认PATH放在您之前选择的PATH之前,并允许其余的个人bash设置脚本(更进一步的命令.bash_profile,或者.bashrc如果您来自,则来自.bash_profile)来进行设置。相应的路径。

希望有道理...


1
这完全为我做到了!我自己将其隐藏在一个if [ -n "$TMUX" ]子句的后面,但是我想知道- [ -f /etc/profile ]真正重要吗?假定该/etc/profile文件始终是常规文件,是否安全?
瑞安·吕

1
@RyanLue您可以轻松地替换-f-e,但是我个人不会尝试从登录时运行的脚本中获取文件,除非我检查了文件是否在那里。我确实倾向于在很多不同的机器(和操作系统)上重用我的bash脚本,所以我想确保它们是防弹的。我可以想象其他一些Unix变体可能会称之为其他名称。
格雷厄姆·阿什顿

谢谢!这让我发疯,并将那段小片段放在我的顶峰上,使我~/.bash_profile回到了快乐的tmux世界。
hoosierEE

如果你不想惹系统默认设置,set -g default-command "${SHELL}".tmux.conf部队TMUX使用非登录shell。无论如何,我都看不出要点,因为通常您已经登录后才打开
tmux。– seeker_of_bacon

5

没有; 排序$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"

0

@Graham Ashton谢谢你的想法

我的建议是你把

if [ -f /etc/profile ]; then
    PATH=""
    source /etc/profile
fi

在其顶部的.zshrc文件中。

确保您的

export NVM_DIR="$HOME/.nvm"
. "/usr/local/opt/nvm/nvm.sh"

在下面。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.