作曲・浄書・指導・音響

金沢音楽制作

金沢音楽制作では、楽曲・楽譜の制作と、作曲や写譜などレッスンを行っています。

tmuxを自動起動する

端末エミュレーターを開いたときに、~/.bashrcを使ってtmuxを自動起動させる方法のメモ。前提として、tmuxの簡単な使い方を知っている必要がある。またシンプルなスクリプトにしたい。環境:Arch linux

自動起動するtmuxの挙動

tmuxの自動起動を、次のような挙動にしたい。まず、仮想コンソールでは自動起動させない。つまり、デスクトップ環境上の端末エミュレーターのみで起動させたい。そして、tmuxを重複して起動させない。また、既にtmuxのセッションがある場合は、既存のセッションにアタッチする。

[目次へ]

スクリプト例

スクリプト例を下掲に示すが、筆者の環境(Arch linux)に合わせたもので、他のディトリビューターでそのまま動く訳ではないことに注意が必要。具体的には、[ $SHLVL = 3 ]の箇所なので次の項で説明する。

$ vi ~/.bashrc
# auto start tmux
tmux_count=$(ps -ax | grep '[t]mux' | wc -l)
if [ $SHLVL = 3 ]; then
  if [ $tmux_count = 0 ]; then
    tmux -u new-session
  elif [ $tmux_count = 1 ]; then
    tmux -u attach
  fi
fi

なお、AND演算が使える[[]]を使って、次のように書くこともできるが、保守性の観点から上掲のスクリプトを使用する。

tmux_count=$(ps -ef | grep '[t]mux' | wc -l)
if [[ $SHLVL = 3 && $tmux_count = 0 ]]; then
  tmux -u new-session
elif [[ $SHLVL = 3 && $tmux_count = 1 ]]; then
  tmux -u attach
fi

[目次へ]

詳細解説

スクリプトは、~/.bash_profileではなく、~/.bashrcに記述した。どちらに記述するかは環境によって違う。筆者は仮想コンソールからコマンドでデスクトップを立ち上げているので、~/.bash_profileに記述してしまうと、仮想コンソールでtmuxが立ち上がってしまう可能性がある。そうなると、一旦tmuxを終了させてデスクトップを立ち上げ、その後端末エミュレーターで再度~/.bash_profileを読み込む必要がある。

スクリプトは次のようなものだ。まず、端末エミュレーターを一つだけ立ち上げ、環境変数$SHLVLで現在のシェルの深度を調べる(筆者の環境なら、Arch linuxとfedora29は3、Linux Mint19は2、macOS Mojaveは1であった)。そして、if文でシェルの深度がtmuxを起動する対象であれば、tmuxの自動起動スクリプトを動かす。

$ echo $SHLVL
3

tmuxが起動しているかを調べるには下掲のコマンドを使う。そしてそれをシェル変数に代入する。これはプロセスからtmuxの文字列を探し、その行数をカウントするものだ。grepの引数の'[t]mux'には、必ずシングルクォート('')をつける。シングルクォートを付けないと、[t]muxをgrepではなく、bashが評価してしまう。例えば、ホームディレトクリにtmuxというファイルが存在した場合、パス名展開されてしまう。詳述は、$ shoptnullglobを調べてほしい。

tmux_count=$(ps -ef | grep '[t]mux' | wc -l)

テストコマンド([])を使って、tmuxがプロセスで起動しているかを判断する。もし、[ $tmux_count = 0 ]ならば、tmuxの新規セッションを立ち上げる。またもし、[ $tmux_count = 1 ]ならば、既存のセッションにアタッチする。なお、tmuxにつけられた-uオプションは、utf-8モードで起動させるもので、環境に合わせて適宜変更されたい。

if [ $tmux_count = 0 ]; then
  tmux -u new-session
elif [ $tmux_count = 1 ]; then
  tmux -u attach
fi

[目次へ]

  • 公開日:19年09月19日
  • 更新日:19年09月26日