我喜欢把我bash_profile
的git 存储库并将其克隆到我可以通过 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
TMUX
tmux在 tmux 会话中设置环境变量,并设置TERM
为screen
.这不是一个 100% 可靠的指标(例如,您无法轻易判断您是screen
在 inside运行tmux
还是tmux
inside运行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
如果您运行的是tmux
3.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