web-dev-qa-db-ja.com

環境変数が設定されているかどうかに応じて、tmux.confで変数を設定して使用する方法

(免責事項:実行中のtmuxサーバーと対話するシェルスクリプトの作成と呼び出し、またはtmuxサーバーを起動する前に必要な環境変数を設定することを含む、以下で説明する問題の解決策があることを十分に承知しています。具体的にこの質問を投稿していますこの問題を解決できるかどうかを確認しますなしこのようなスクリプトの使用。)

問題の概要

私の_.tmux.conf_ファイルで、tmuxを呼び出す前に環境変数VALUEが設定されているかどうかに応じて、ローカル変数FOOを異なる値に設定しようとしています。次に、他のtmuxコマンドでVALUEを使用したいと思います。残念ながら、VALUEを正しく設定できないか、設定後にアクセスできません。

以前の試み

マンページや、サンプルのtmuxコードを含む他のQ&Aの投稿で私が見つけたものによると、上記を実装する方法はいくつかあります。

試行1

最初に_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は正しく設定されているようですが、RESULTVALUEにアクセスできないようです。

試行2

マンページには、_%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で条件文をどのように記述する必要がありますか?
7
Stipe Matic

また、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
0