(免責事項:実行中のtmuxサーバーと対話するシェルスクリプトの作成と呼び出し、またはtmuxサーバーを起動する前に必要な環境変数を設定することを含む、以下で説明する問題の解決策があることを十分に承知しています。具体的にこの質問を投稿していますこの問題を解決できるかどうかを確認しますなしこのようなスクリプトの使用。)
私の_.tmux.conf
_ファイルで、tmuxを呼び出す前に環境変数VALUE
が設定されているかどうかに応じて、ローカル変数FOO
を異なる値に設定しようとしています。次に、他のtmuxコマンドでVALUE
を使用したいと思います。残念ながら、VALUE
を正しく設定できないか、設定後にアクセスできません。
マンページや、サンプルのtmuxコードを含む他のQ&Aの投稿で私が見つけたものによると、上記を実装する方法はいくつかあります。
最初に_if-Shell
_コマンドを使用してみました。 _-b
_フラグありとなしの両方でこのコマンドを使用しようとしました。結果はどちらの場合も同じでした。
例から、_VALUE=bar
_という構文で変数を割り当てることができることがわかりました。それを踏まえて、これが私の構成の最小限の例です:
_if-Shell '[ -z "$FOO" ]' \
'VALUE=bar' \
'VALUE=baz'
set-environment -g RESULT $VALUE
_
ターミナルセッション:
_$ echo $FOO
$ tmux
[detached (from session 0)]
$ tmux showenv -g VALUE
VALUE=bar
$ tmux showenv -g RESULT
RESULT=
$ killall tmux
$ export FOO=foo
$ echo $FOO
foo
$ tmux
[detached (from session 0)]
$ tmux showenv -g VALUE
VALUE=baz
$ tmux showenv -g RESULT
RESULT=
_
そのため、VALUE
は正しく設定されているようですが、RESULT
はVALUE
にアクセスできないようです。
マンページには、_%if
_ステートメントを使用して条件付きでコマンドを実行できることも記載されています。このフォーマットを使用して、次の構成を試しました。
_%if #{#(if [ -z "$FOO" ]; then echo 1; else echo 0)}
VALUE=bar
%else
VALUE=baz
%endif
set-environment -g RESULT $VALUE
_
_%if
_ステートメントの式について、次のようなバリエーションを試しました。
#{#([ -z "$FOO" ])}
(このコマンドは出力を生成しないため、これは機能しないはずですが、試してみる価値はありました。)#{==:#(if [-z "$FOO" ]; then echo 1; else echo 0),1}
(明示的な比較が機能する場合に備えて)これらのバリエーションがあっても、FOO
が設定されているかどうかに関係なく、次の結果が得られました。
_$ tmux
[detached (from session 0)]
$ tmux showenv -g VALUE
VALUE=baz
$ tmux showenv -g RESULT
RESULT=baz
_
したがって、VALUE
はアクセス可能でしたが、常にbaz
でした。
残念ながら、条件付きステートメントで使用されている形式に関する有用な例は見つかりませんでした。マンページでは、tmux変数へのアクセス方法といくつかのフォーマットのヒントについて説明しています。ただし、環境変数へのアクセスに関しては、シェルコマンドを使用する方法しか見つかりませんでした。
さらに、シェルコマンドの出力の最初の行は、
#()
を使用して挿入できます。たとえば、#(uptime)
はシステムの稼働時間を挿入します。フォーマットを構築するとき、tmuxは#()
コマンドが完了するのを待ちません。代わりに、同じコマンドを実行した結果の以前の結果、またはコマンドが以前に実行されていない場合はプレースホルダーが使用されます。
これが#()
のコマンドを2回呼び出して、プレースホルダー値を使用しないようにする必要があるかどうかはわかりません。
また、_#{}
_コマンドの結果を簡単に出力して、ステートメントのこの部分をデバッグする方法を見つけることができませんでした。
この問題を解決するのに役立つ情報へのポインタがあれば幸いですが、私にとって最も切迫した質問は次のとおりです。
VALUE
が正しく設定されているにもかかわらず、試行1でRESULT
にアクセスできないのはなぜですか?VALUE
が正しく設定されていることを確認するには、試行2で条件文をどのように記述する必要がありますか?また、display -pを使用してフォーマットを印刷することもできます。 masterおよび2.9では、-vを追加して、それらがどのように解析されるかを確認できます。
$ tmux setenv -g FOO bar
$ tmux display -pv '#{==:#{FOO},baz}'
# expanding format: #{==:#{FOO},baz}
# found #{}: ==:#{FOO},baz
# modifier 0 is ==
# expanding format: #{FOO}
# found #{}: FOO
# format 'FOO' found: bar
# replaced 'FOO' with 'bar'
# result is: bar
# expanding format: baz
# result is: baz
# compare == left is: bar
# compare == right is: baz
# replaced '==:#{FOO},baz' with '0'
# result is: 0
0