tmuxを自動起動する
端末エミュレーターを開いたときに、~/.bashrc
を使ってtmuxを自動起動させる方法のメモです。
環境:Arch Linux、Ubuntu 20.04.3 LTS
自動起動する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
が一度立ち上がってしまう可能性があります。
スクリプトの処理内容は次のようなものです。まず、端末エミュレーターを一つだけ立ち上げ、環境変数$SHLVL
で現在のシェルの深度を調べます。筆者が調べたところだと、Arch linuxとfedora29は3
、Linux Mint19は2
、macOS Mojaveは1
でした。そして、if
文でシェルの深度がtmux
を起動する対象であれば、tmux
を起動させます。
$ echo $SHLVL
3
tmux
が起動しているかを調べるには次のコマンドを使って、その結果をシェル変数に代入します。
tmux_count=$(ps -ef | grep '[t]mux' | wc -l)
これはプロセスからtmuxの文字列を探しだし、その行数をカウントしています。grep
の引数の'[t]mux'
には、必ずシングルクォート(''
)をつけてください。シングルクォートを付けないと、文字列[t]mux
をgrep
ではなく、bash
が評価してしまいます。たとえば、ホームディレトクリにtmux
というファイルが存在した場合、それがパス名展開されます。詳細は、$ shopt
のnullglob
を調べてみてください。
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
初回ログインでエラーを吐く
Ubuntu 20.04.3 LTSで、デスクトップマネージャー(gmd3)から初回ログインすると、次のようなエラーダイアログが表示されました。このエラーは、Arch LinuxゃLinux Mint、またmacOSでは発生しないので、UbuntuかGnome 3に由来するものかも知れません。
Error found when loading /home/$USER/profile:
open terminal failed: not a terminal
As a result the session will not be configured correctly.
You should fix the problem as soon as feasible.
応急的な解決は、.bashrc
を、.profile
ではなく.bash_profile
から読み込むようにします。Ubuntu 20.04.3 LTSでは、.bash_profile
が存在しないので、.profile
をコピーして.bash_profile
作成し、その後.profile
が読み込まれないように、リネームしておきます。
$ cp .profile .bash_profile
$ mv .profile .profile_bk
この方法で本当によいのかは分かりません。
更新情報
- 作成日:2019-09-19
- 更新日:2019-09-26
- 更新日:2021-07-13
- 更新日:2022-04-30