私は複数のプロジェクトがあり、それぞれのプロジェクトに、そのプロジェクトに固有の値に設定された環境変数を利用する多くのスクリプトがある状況で作業しています。
私がしたいことは、プロジェクトごとに個別のtmuxセッションを使用し、そのセッションのすべてのウィンドウに変数が設定されるように変数を設定することです。
-gオプションを使用して機能するset-environmentオプションを使用しようとしましたが、そのサーバーに接続されているすべてのセッションの変数を設定しました。
-gオプションを指定しないと、show-environmentを使用するとそのセットが表示されますが、シェルで変数にアクセスできません。
誰かがこれを修正する方法を考え出しましたか?
Tmux 1.8とtcshの使用
私はこれを行う方法を見つけました。 tmux 2.5を使用しています。
背景
Tmuxのマニュアルページには、グローバル変数とセッションごとの2つのグループの環境変数があると記載されています。新しいtmuxセッションを作成すると、2つのグループがマージされ、セッション内で使用できる環境変数のセットになります。環境変数がグローバルグループに追加されると、開いているすべてのセッション間で共有されるようです。それらをセッションごとのグループに追加します。
これを行う
手順1:tmuxセッションを作成します。
tmux new-session -s one
ステップ2:セッションごとのグループに環境変数を追加します。
tmux setenv FOO foo-one
これにより、環境変数がセッションごとの環境変数セットに追加されます。 tmux showenv
と入力すると、出力に表示されます。ただし、現在のセッションの環境にはありません。 「echo $FOO
」と入力しても何も起こりません。これを行うにはもっと良い方法があるでしょうが、手動でエクスポートするのが最も簡単だと思いました。
export FOO='foo-one'
ステップ3:新しいウィンドウ/ペインを作成する
現在、現在のセッションで新しいウィンドウまたはペインを作成するたびに、tmuxはセッションごとのグループからFOO環境変数を取得します。
自動化
私はbashスクリプトを使用して、これらの環境変数を使用するtmuxセッションを自動的に作成します。上記を自動化する方法の例を次に示します。
#!/bin/bash
BAR='foo-one'
tmux new-session -s one \; \
setenv FOO $BAR \; \
send-keys -t 0 "export FOO="$BAR C-m \; \
split-window -v \; \
send-keys -t 0 'echo $FOO' C-m \; \
send-keys -t 1 'echo $FOO' C-m
次のコマンドを使用して、セッション中に、各セッションのtmux(ローカル)環境変数にアクセスできます。
bash> tmux show-environment
-gパラメータを追加すると、すべてのセッションの環境、つまりグローバル環境が取得されます。ローカル環境はグローバル環境と同じではありません。前のコマンドはローカル環境全体を出力しますが、変数を1つだけ表示することもできます。
bash> tmux show-environment variable_name
variable_name=value
値を取得するには、いくつかの「sed」マジックを使用するか、単一の変数で「エクスポート」を使用するか、環境全体をシェルに「エクスポート」することもできます。以下は3つのアプローチです。
bash> tmux show-environment variable_name | sed "s:^.*=::"
value
bash> eval "export $(tmux show-environment variable_name)"
bash> echo $variable_name
value
bash> for var in $(tmux show-environment | grep -v "^-"); do eval "export $var"; done;
bash> echo $variable_name
value
必要に応じて、グローバル環境にアクセスする場合は、show-environmentコマンドの後に-gパラメータを追加できます。
私は簡単にやった
export MY_VAR="some value"
tmuxセッションを開始する前に、そのセッション内のすべてのウィンドウからMY_VAR
にアクセスできます。