Bash

如何通過 bash 腳本判斷我是否在 tmux 會話中?

  • May 26, 2021

我喜歡將其保存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 腳本不是我的強項。)

TmuxTMUX在 tmux 會話中設置環境變數,並設置TERMscreen. 這不是一個 100% 可靠的指標(例如,您無法輕易判斷您是在screeninsidetmux還是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

引用自:https://unix.stackexchange.com/questions/10689