TTY 虚拟控制台 + tmux:似乎 ~/.bashrc 运行多次?

TTY 虚拟控制台 + tmux:似乎 ~/.bashrc 运行多次?

我更喜欢使用 tmux 而不是默认的 linux 虚拟控制台(即agetty使用什么),因此我将其放入,~/.bashrc以便当我登录 TTY 时 tmux 自动运行:

if [[ "$(tty)" == /dev/tty* ]]; then
    tmux -u
fi

乍一看,这似乎有效:tmux 在我登录后立即运行。但是,当我退出 tmux 时,tmux 立即运行第二次!这是完整的行为:

  • ctrl+ alt+f2
  • 登录
  • tmux 运行前短暂可见的默认提示
  • 算我一个tmux
  • ctrl+d
  • 文字[exited]短暂闪烁,然后我tmux又回来了
  • ctrl+d
  • 返回默认终端,无需tmux
  • ctrl+d
  • 现在我已经完全退出了

我无法追踪这一点 - 我尝试过记录各种事情,设置环境变量,查看$SHLVL.实际上.bashrc,每次我登录时,它看起来都会运行 7 次!

我通常不会在 X 中使用 tmux(我只使用 Konsole),但我尝试设置 bashrc 以使 tmux 为所有非 tmux 会话运行,并且这种双重行为确实不是发生在 Konsole。

我在用着:

可能是什么原因造成的?

答案1

修复#1:

无法追踪它,但设法通过我的以下 hack 解决了这个问题~/.bashrc

if [ -z "$user_bashrc_already_run" ]; then
    export user_bashrc_already_run=1
else
    return
fi

修复#2:

设法正确地追踪到这一点。由于 TTY 是一个交互式登录 shell,它同时运行/etc/profile~/.profile(X 中的终端仿真器两者都不加载,因为它不是登录 shell)。就我而言(我不知道为什么,可能是 Bashish 安装或其他原因),这些文件是相同的,并且都来源 中的所有脚本/etc/profile.d,在我的情况下,其中包括一个来源~/.bashrc.

删除所有重复代码~/.profile解决了问题。

阅读“调用”部分man bash以及诸如此类的问题https://serverfault.com/questions/261802/what-are-the-function-differences- Between-profile-bash-profile-and-bashrc很有用。


如果有人遇到类似问题,这里有一个更好的运行 tmux 的方法,因为它会导致 shell 被 tmux 替换,而不是将 tmux 作为子 shell 运行:

if command -v tmux>/dev/null; then # check if tmux command exists
    if [[ "$(tty)" =~ /dev/tty ]] && [[ ! "$TERM" =~ screen ]] && [ -z "$TMUX" ]; then
        # We're on a TTY and *not* in tmux
        exec tmux -u
    fi
fi

我决定将其放在我的中,~/.profile因为我希望它在登录 shell 上运行,而不是在非登录 shell 上运行。 (请注意,如果您有~/.bash_profile,bash 将运行它而不是~/.profile。)

相关内容