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


53

我喜欢将自己保存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脚本并不是我的专长。)

Answers:


72

Tmux TMUX在tmux会话中设置环境变量,并设置TERMscreen。这不是100%可靠的指标(例如,您无法轻松判断是在screen内部tmux还是tmux在内部运行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实例中运行,并包含外壳自定义项,例如提示和别名。~/.bash_profile在登录时运行(如果您的登录shell是bash)。奇怪的是,bash不会~/.bashrc在登录shell中读取,因此您~/.bash_profile应该包含

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

还有一个替代变量TMUX_PANE。我只是注意到了,因为您的食谱无效。后来我发现unset我在通过我的shell脚本中不适当地(后来)使用了一个变量.profile
0xC0000022L14年

[ "$TERM" = "screen" ]可能不起作用。就我而言,我的屏幕报告为screen-256彩色。
StevieD

@StevieD我不认为tmux会自己执行此操作,但是它可能是发行补丁或配置。
吉尔斯(Gillles)“所以-不要再邪恶了”

2

在尝试了不同的方式之后,这最终对我有用,以防万一它可以帮助任何人:

if [[ "$TERM" =~ "screen".* ]]; then
  echo "We are in TMUX!"
else
  echo "We are not in TMUX :/  Let's get in!"
  # Launches tmux in a session called 'base'.
  tmux attach -t base || tmux new -s base
fi

在此代码段中,我检查是否在TMUX环境中,然后将其启动。如果将此代码段放入.bashrc文件中,则在打开终端时将自动运行TMUX!PS:在Ubuntu Shell上测试。


1

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

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

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

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

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.