如何通过 bash 脚本判断我是否处于 tmux 会话中?

如何通过 bash 脚本判断我是否处于 tmux 会话中?

我喜欢把我bash_profilegit 存储库并将其克隆到我可以通过 shell 访问的任何机器上。因为我tmux大部分时间都user@host在状态行中显示一个字符串,而不是在 shell 提示符中传统的位置。

不过,并非我使用的所有网站都已tmux安装,或者我可能并不总是使用它。我想检测我何时不在tmux会话中并相应地调整我的提示。到目前为止,我的半生不熟的解决方案看起来.bash_profile像这样:

_display_host_unless_in_tmux_session() {
    # ???
}
export PROMPT_COMMAND='PS1=$(_display_host_unless_in_tmux_session)${REST_OF_PROMPT}'

(每次检查可能不是最好的方法,所以我愿意接受更好的方法的建议。Bash 脚本不是我的强项。)

答案1

TMUXtmux在 tmux 会话中设置环境变量,并设置TERMscreen.这不是一个 100% 可靠的指标(例如,您无法轻易判断您是screen在 inside运行tmux还是tmuxinside运行screen),但在实践中它应该足够好。

if ! { [ "$TERM" = "screen" ] && [ -n "$TMUX" ]; } then
  PS1="@$HOSTNAME $PS1"
fi

如果您需要将其集成到复杂的提示设置中PROMPT_COMMAND(顺便说一下,这是一个 bash 设置,因此不应导出):

if [ "$TERM" = "screen" ] && [ -n "$TMUX" ]; then
  PS1_HOSTNAME=
else
  PS1_HOSTNAME="@$HOSTNAME"
fi
PROMPT_COMMAND='PS1="$PS1_HOSTNAME…"'

如果您需要测试是否安装了 tmux:

if type tmux >/dev/null 2>/dev/null; then
  # you can start tmux if you want
fi

顺便说一句,这一切都应该进入~/.bashrc,而不是~/.bash_profile(参见.bashrc 和 .bash_profile 之间的区别)。~/.bashrc在每个 bash 实例中运行,并包含 shell 自定义,例如提示和别名。~/.bash_profile当您登录时运行(如果您的登录 shell 是 bash)。奇怪的是,bash 不会~/.bashrc在登录 shell 中读取,所以你~/.bash_profile应该包含

case $- in *i*) . ~/.bashrc;; esac

答案2

至于之前的答案,测试${TERM}变量可能会导致极端情况,tmux在其自己的生命周期内设置环境变量:

$ env|grep -i tmux
TMUX=/tmp/tmux-1000/默认,4199,5
TMUX_PANE=%9
TMUX_PLUGIN_MANAGER_PATH=/home/imil/.tmux/plugins/

为了检查您是否在某个tmux环境中,只需检查:

$ [ -z "${TMUX}" ] && echo "not in tmux"

答案3

如果您运行的是tmux3.2 或更高版本(或使用OpenBSD 6.8 或更高版本tmux从源代码构建更新于 2020 年 5 月 16 日),您可以使用TERM_PROGRAM环境变量。

if [ "$TERM_PROGRAM" = tmux ]; then
  echo 'In tmux'
else
  echo 'Not in tmux'
fi

早期版本tmux没有此环境变量。

答案4

有时你可能无法访问$TMUX,而且$TERM肯定不可靠。然后,您可以比较窗口 id:从自身获取的 idtmux和您可以从 获取的 id xdotool

if [ $(tmux showenv | awk -v FS='=' '/WINDOWID/{print $2}') \
     -eq \
     $(xdotool getactivewindow) ]
then
    echo "This terminal is running tmux!"
fi

相关内容