アルアカ - Arcadia Academia

Arcadia Academiaは「エンジニアリングを楽しむ」を合言葉に日本のデジタル競争力を高めることをミッションとするテックコミュニティです。

tmuxのnew-sessionで環境変数が届かない時に使う-eオプション

Featured image of the post

「tmux new-sessionで新しいセッションを起動したのに、スクリプト内で参照している環境変数が空になっている」 「呼び出し元のシェルでexportしているはずなのに、なぜか新しいtmuxセッションの中でだけ値が見えない」 「VAR=val ./script.shのように渡しても、tmux越しだと反映されないことがある」

tmuxは新しいセッションをデタッチされた別プロセスとして起動するため、呼び出し元シェルの環境がそのまま引き継がれるとは限らない。しかもエラーは一切出ず、変数が空のまま・あるいは既定値で静かに動いてしまうため、原因に気づきにくい。この記事では、tmuxのnew-sessionに環境変数が届かない理由と、確実に渡すための-eオプションの使い方、動作確認の手順をまとめる。

💡
30秒で要点
- 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が使えるか事前に確認しておくと詰まりを避けられる。

プログラミング学習でつまずいていませんか?

独学で挫折しそうな方も、プロのメンターがしっかりサポートします。

  • プログラミング学習の進め方がわからない
  • 独学で行き詰まった時の質問相手がほしい
  • 何から始めればいいかわからない
まずは30分の無料相談

相談は完全無料・オンラインで気軽に

あなたを爆速で成長させるメンタリングプログラムはこちら

メンタープログラムバナー

学習・開発のお悩みは現役エンジニアに相談

メンタープログラムの詳細を見る

エンジニアの基礎学習ゲーム

プログラミング学習支援

無料相談はこちら