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


53

私は自分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スクリプトは私の得意ではありません。)

回答:


72

Tmuxは、TMUXtmuxセッションで環境変数を設定TERMし、に設定しscreenます。これは100%の信頼できる指標ではありません(たとえば、screen内部で実行しているtmuxtmux内部で実行しているかを簡単に判断することはできません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

代替変数TMUX_PANEもあります。あなたのレシピが機能しなかったために気づいただけです。後で私は、私がunset自分のソースから調達しているシェルスクリプトの変数を過度に使用したことを発見しました.profile
0xC0000022L 14年

[ "$TERM" = "screen" ]動作しない場合があります。私の場合、画面はscreen-256色として報告していました。
スティービー

@StevieD tmuxが単独でこれを行うとは思わないが、それはディストリビューションのパッチまたは設定かもしれない。
ジル「SO-悪であるのをやめる」

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


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"

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.