我更喜欢使用 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。
我在用着:
- Arch Linux (4.8.13-1)
- 阿吉蒂
- 多路复用器
- 巴什什
- 完整
~/.bashrc
和其他配置(无~/.bash_profile
文件):https://gist.github.com/tobek/c8038c207f318528c3157b4a402aa2d9(我尝试删除 bashish 的东西,但行为仍然存在)
可能是什么原因造成的?
答案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
。)