tmux で複数コマンドを複数ペインでさっと実行する

だいぶ前に社内ブログで次のような方法で tmux でペイン分割して複数コマンドを同時に実行する方法を紹介していたのですが、

tmux new-session -d ping 1.1.1.1 &&\
tmux split-window ping 8.8.8.8 &&\
tmux split-window ping 8.8.4.4 &&\
tmux set-window-option synchronize-panes &&\
tmux select-layout even-vertical &&\
tmux attach

asciicast

がしかし tmux のコマンドを覚えなくてももっと簡単にできるラッパーがあります。

xpanes

xargs っぽい感覚で tmux でペイン分割できるラッパーです。機能はいろいろ豊富ですが次のようにすれば↑でやろうとしていたこととだいたい同じことができます。

xpanes -ss -e 'ping 1.1.1.1' 'ping 8.8.8.8' 'ping 8.8.4.4'

asciicast

これは便利!

しかもこのコマンド epel からサクッとインストールできます。

sudo dnf -y install epel-release
sudo dnf -y install xpanes

これは楽ちん!

がしかしコマンドが開始されるまでが異様に遅いです。tmux を直接叩けばもっとサクッと動くのですが・・・

tmux-cmds

xpanes だとコマンドが開始されるまで異様に遅かったので、もっと簡単なラッパーを作ってみたのがこれ。

tmux-cmds ping 1.1.1.1 :: ping 8.8.8.8 :: ping 8.8.4.4

asciicast

これは便利!!

ただのシェルスクリプトなのでパスを通したところにダウンロードすれば OK です。

curl -L https://raw.githubusercontent.com/ngyuki/dotfiles/master/bin/tmux-cmds -o "$HOME/bin/tmux-cmds"
chmod +x "$HOME/bin/tmux-cmds"

これは・・・yum とか dnf で入れられるのと比べると楽ちんではないですね。

tmux multiple commands

tmux-cmds を作るために tmux の man を見ていたら、tmux の複数コマンドを一撃で指定できることを知りました。

なので、最初の tmux を直接使う版は次のように変更できます。

tmux new-session ping 1.1.1.1 \;\
    split-window ping 8.8.8.8 \;\
    split-window ping 8.8.4.4 \;\
    set-window-option synchronize-panes \;\
    select-layout even-vertical

asciicast

tmux のコマンドには短いエイリアスがあるのと、コマンドやオプションは前方一致で候補が一つなら自動的にそれが指定されたことになるので、次のようにも書けます。

tmux new ping 1.1.1.1 \; split ping 8.8.8.8 \; split ping 8.8.4.4 \; set sync \; selectl even-v

asciicast

これは便利!!! ラッパーとか使わなくてもこれで十分では感があります(この投稿のモチベーション)。

もう少し削れますが、これはむしろわかりにくいですね。

tmux new ping 1.1.1.1 \; sp ping 8.8.8.8 \; sp ping 8.8.4.4 \; set sy \; selectl even-v