Tmux if-shell 条件は常に false

Tmux if-shell 条件は常に false

親シェル (bash) から継承された値に基づいてTERM、 tmux セッションの環境変数を設定しようとしています。 に次の行があり、実際に継承されることに注意してください。.tmux.confTERM.tmux.confTERM

set -g update-environment '...some variables... TERM'

基本的に、親シェル内にTERMあり、それを検出して、次を使用してオプションを設定します。xterm-256colordefault-terminal

if "[[ ${TERM} =~ 256color ]]" 'set -g default-terminal screen-256color'

この行は、私の職場の PC (RHEL 6.6) 上の tmux 1.9a では機能し、適切に に設定されますTERMscreen-256color、他の PC (職場で tmux 1.8 を実行している Ubuntu PC や、tmux 2.1 を実行している自宅の Ubuntu PC を含む) では、「condition」コマンドは常に false を返すようで、新しい tmux セッション内にTERM残っています。screen

も試してみましたがif 'true' 'set -g default-terminal screen-256color'、これも機能しませんでした。 (TERMはまだscreen新しい tmux セッション内にあります)。

私が何を間違っているのかを解明するのを手伝ってくれる人はいませんか? また、1 台のマシンでは動作するのに対し、他の 2 台では動作しない理由についても情報を提供してもらえますか?


アップデート:

tmux非常に詳細な出力をオンにして実行した後( tmux -vvvvvvvvvv)、問題がわかったと思います。

サーバー ログ ファイル (tmux-server-xxxx.log)を見るとtmux、次のログ行がこの順序で表示されます (間に他の行がありますが省略しています)。

run job 0x55fbca2e7240: [[ xterm-256color =~ 256color ]], pid 4955
cmdq 0x55fbca2dc250: new-session (client 7)
session 0 created
job died 0x55fbca2e7240: [[ xterm-256color =~ 256color ]], pid 4955

新しいセッションが作成されているように見えます前にシェルコマンドは終了するので、セッションオプションは後で設定されません...しかし、設定中です。

これを確認するには、このセッションをデタッチし、/sets を.tmux.confチェックする行をコメント アウトするように編集してから、新しいセッションを作成します。新しいセッションには が含まれます。$TERMdefault-terminalTERM = screen-256color

コマンドが期待どおりに動作している RHEL コンピュータでは、次のログ行が異なる順序で表示されます。

run job 0x1e82ce0: [[ xterm-256color =~ 256color ]], pid 17656
job died 0x1e82ce0: [[ xterm-256color =~ 256color ]], pid 17656
cmdq 0x1e66850: new-session (client 7)
session 0 created

...これは予想どおりです。そして、TERM適切に に設定されていますscreen-256color

-bコマンドにオプションを指定していないのでif-shell、これらの 2 台の Ubuntu マシンでコマンドがバックグラウンドで実行されているように見える理由がわかりません。これは tmux で競合状態が発生している可能性があるのでしょうか?

答え1

アップデート前の質問に対する答えがおそらくあると思います。

述べたようにここ:

tmux は、指定したシェル コマンドを実行するために /bin/sh -c を使用することに注意してください。したがって、コマンドは POSIX 準拠である必要があり、[[ 形式のテストは移植性が保証されません。たとえば、最近の Ubuntu および Debian システムでは、/bin/sh を dash にシンボリック リンクします。

私の場合はそうでした。「あなたの」メソッドを次のメソッドに置き換えた後、すべてが機能しました。 if-shell "echo $TERM | grep 256color" 'set -g default-terminal screen-256color'

関連情報