web-dev-qa-db-ja.com

bashスクリプトからtmuxセッションにいるかどうかを確認するにはどうすればよいですか?

私はbash_profilegitレポジトリ に保存し、シェルにアクセスできる任意のマシンにそれを複製します。私は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スクリプトは私の得意ではありません。)

60
Brant

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

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

さまざまな方法を試した後、これが私にとって最終的に機能したものです。

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でテスト済み。

2
Alexar

以前の回答と同様に、${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"

2
iMil