作曲・指導・C言語・Linux

金沢音楽制作

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

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]muxgrepではなく、bashが評価してしまいます。たとえば、ホームディレトクリにtmuxというファイルが存在した場合、それがパス名展開されます。詳細は、$ shoptnullglobを調べてみてください。

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