bashスクリプトを使ってtmuxセッションにいるかどうかはどうすればわかりますか?

bashスクリプトを使ってtmuxセッションにいるかどうかはどうすればわかりますか?

bash_profile私を入れるのが好きです。Gitリポジトリシェルを介してアクセスできるすべてのコンピュータに複製します。tmuxほとんどの場合、user@hostシェルプロンプトの従来の場所ではなくステータス行に文字列を表示するためです。

ただし、私が使用しているすべてのサイトにこの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セッション内で環境変数を設定し、にTERM設定されます。これは100%信頼できる指標ではありませんが(たとえば、内部で実行されているのか外部で実行されているのかscreen簡単にはわかりません)、実際には十分です。screentmuxtmuxscreen

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ログイン時に実行します(ログインシェルがbashの場合)。奇妙なことに、bashは~/.bashrcログインシェルを読み取らないので、以下~/.bash_profileを含める必要があります。

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

答え2

以前の答えと同様に、変数をテストすると、環境変数が自分の寿命内に設定される${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"

答え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

関連情報