「tmux new-sessionで新しいセッションを起動したのに、スクリプト内で参照している環境変数が空になっている」 「呼び出し元のシェルでexportしているはずなのに、なぜか新しいtmuxセッションの中でだけ値が見えない」 「VAR=val ./script.shのように渡しても、tmux越しだと反映されないことがある」
tmuxは新しいセッションをデタッチされた別プロセスとして起動するため、呼び出し元シェルの環境がそのまま引き継がれるとは限らない。しかもエラーは一切出ず、変数が空のまま・あるいは既定値で静かに動いてしまうため、原因に気づきにくい。この記事では、tmuxのnew-sessionに環境変数が届かない理由と、確実に渡すための-eオプションの使い方、動作確認の手順をまとめる。
-
tmux new-sessionは呼び出し元のexportやVAR=val commandを新しいセッションに自動で引き継がない - 環境変数を確実に渡すには
tmux new-session -e KEY=VALUE ...を使う(tmux 3.4以降) - 古いtmuxでは
-eが使えないため、set-environmentで代替する - 反映されているかは
send-keysとcapture-paneで確認できる 目次を開く
tmuxのnew-sessionで環境変数が届かない典型的な症状
呼び出し元でトークンなどをexportしてから、tmuxの新しいセッションでスクリプトを起動する場面を考える。
export MY_TOKEN=abc123
tmux new-session -d -s work './run.sh' run.shの中でecho "$MY_TOKEN"を実行しても値が空になる。VAR=val tmux new-session ...のように1行にまとめて渡した場合も結果は変わらない。これはtmuxコマンド自身の環境に変数が渡るだけで、新しいセッションの中のシェルには渡らないためだ。
原因: tmuxのセッションは呼び出し元の環境をそのまま複製しない
tmuxはサーバー・クライアント方式で動く常駐プロセスで、最初にサーバーが起動した時点の環境を基準として保持する。2回目以降にnew-sessionを実行しても、呼び出し元シェルの「今の」環境がそのまま新しいセッションに複製されるわけではないため、あとからexportした変数は伝わらない。
確認: tmuxサーバーが保持している環境を見る
tmux show-environment | grep MY_TOKEN ここに出てこなければ、新しいセッションのシェルからも参照できない。
解決策1: -eオプションで明示的に渡す(tmux 3.4以降)
tmux new-session -d -s work -e MY_TOKEN="$MY_TOKEN" './run.sh' 複数の変数を渡したい場合は-eを繰り返す。
tmux new-session -d -s work -e MY_TOKEN="$MY_TOKEN" -e MY_ENV=prod './run.sh' -eが使えるかは手元のtmuxのバージョンで決まる。
tmux -V 3.4未満の場合は-eオプション自体が存在しないため、次の代替策を使う。
解決策2: 古いtmuxでの代替 — set-environment
tmux new-session -d -s work
tmux set-environment -t work MY_TOKEN "$MY_TOKEN"
tmux send-keys -t work './run.sh' Enter セッションを起動してからset-environmentで変数を登録し、その後にコマンドをsend-keysで流し込む。手順は増えるが、-eが無いバージョンでも同じ結果になる。
動作確認の手順
GUIでセッションにアタッチしなくても、変数が実際に見えているかは確認できる。
tmux send-keys -t work 'echo "MY_TOKEN=$MY_TOKEN"' Enter
sleep 1
tmux capture-pane -t work -p | tail -n 3 capture-paneは現在のペインの表示内容をテキストとして取得するので、値が入っているかを目視で確認できる。
うまくいかない時の切り分け
| 症状 | 原因 | 確認コマンド |
|---|---|---|
| 変数が空でエラーも出ない | -eを使わずexportのみで渡そうとした | tmux show-environment |
-eを指定してもエラーになる | tmuxが3.4未満 | tmux -V |
capture-paneで値が見えない | send-keys直後で描画が終わっていない | sleepの秒数を増やして再実行 |
| セッションごと見つからない | セッション名の指定ミス | tmux list-sessions |
まとめ
tmuxのnew-sessionは呼び出し元シェルの環境変数を自動では引き継がない。これはエラーを伴わずに既定値で静かに動くため気づきにくい詰まりだが、原因は「複製されない」という1点に尽きる。tmux 3.4以降なら-eオプションで明示的に渡し、古いバージョンではset-environmentで代替する。反映確認はsend-keysとcapture-paneの組み合わせで、アタッチせずに済む。
よくある質問(FAQ)
Q1. tmuxを起動し直せば環境変数は最新になりますか?
tmuxサーバー自体をtmux kill-serverで終了してから起動し直せば、その時点の環境を拾い直せる。ただしサーバー上の既存セッションもすべて終了するため、常駐用途では現実的でないことが多い。個別のセッションだけに渡したい場合は-eかset-environmentを使う方が安全。
Q2. .tmux.confに書くset-environmentとの違いは何ですか?
.tmux.conf内のset-environmentはtmuxサーバー起動時に固定値を設定するもので、呼び出し元シェルで動的に変わる値を都度渡す用途には向かない。実行時に変わる値はnew-session -eかコマンドラインからのset-environmentで渡す。
Q3. 複数の環境変数を一度に渡したいときはどうしますか?
-eをスペース区切りで複数回指定すればよい。tmux new-session -d -e A=1 -e B=2 -s workのように書ける。
Q4. 手元のtmuxのバージョンはどこで確認しますか?
tmux -Vで表示される。ディストリのパッケージ版は3.4未満のこともあるため、-eが使えるか事前に確認しておくと詰まりを避けられる。
