てけもぐ Tech 備忘録

tmux で既存のセッションに接続した時に環境変数を更新する

対象

tmux 初学者

内容

tmux で既に開いているセッションは、当然の事ながら外側の環境変数の更新なんて考慮しない。でも、それだとログインしたら毎回変わる変数、例えばソケットのパスとかが反映されない。

以下の手順で session-attached された時に更新するようにしたのでメモしておく。以下は NIRI_SOCKET の値を接続する毎に更新する例。

~/.config/tmux/tmux.conf:

set-option -g update-environment "NIRI_SOCKET"
set-hook -g client-attached  'run-shell "tmux list-panes -a -F \"##{pane_pid}\" | xargs -I {} kill -USR1 {}"'

~/.bashrc:

TRAPUSR1() { 
  if [ -n "$TMUX" ]; then 
     eval "$(tmux show-environment -s NIRI_SOCKET 2>/dev/null)" 
  fi
}
trap TRAPUSR1 SIGUSR1

tmux の方では、session-attach で接続される度に、USR1 シグナルを該当プロセスに送って、 bash の方でシグナルを受けて eval で現シェルでの変数を更新。