tmux入門 - セッション・ウィンドウ・ペインの基本とtmux.confの設定

tmux入門 - セッション・ウィンドウ・ペインの基本とtmux.confの設定

作成日:
読了:約46分
更新日:

当サイトは Amazon.co.jp を宣伝しリンクすることで紹介料を得る手段を提供する、Amazonアソシエイト・プログラムの参加者です。価格・在庫はリンク先の最新情報をご確認ください。

tmuxは、1つのターミナルの中で複数の端末を動かし、切り離したり、あとからつなぎ直したりできるツールです。SSHで長い処理を走らせている途中で接続が切れても処理は止まらず、つなぎ直せば同じ画面の続きから作業できます。

便利なことは知っていても、「コピペした設定で何となく使っている」「スクロールの仕方が分からない」という人は多いと思います。この記事では、tmuxの仕組みから基本操作、スクロールとコピー、tmux.confの設定、自動化、つまずきやすいエラーの対処までを順に整理します。

NOTE

仕様は2026年11月10日に、tmux 3.6aのmanページ、tmux公式Wiki、CHANGESで確認しました。コマンドの実行結果は、macOSのHomebrew版tmux 3.6aで、普段の環境と干渉しない専用ソケットを使って確かめたものです。既定値はバージョンで変わることがあり、3.8との違いはその都度書きます。

tmuxとは何か、何が嬉しいのか

tmuxは「ターミナルマルチプレクサ」と呼ばれるソフトウェアです。manページには、複数の端末を1つの画面から作成、操作でき、画面から切り離してバックグラウンドで動かし続け、あとで接続し直せると書かれています。

実際の利点は次のようなものです。

嬉しいこと具体例
接続が切れても処理が続くSSH先で実行したビルドやマイグレーションが、回線断やPCのスリープで止まらない
1つの画面を分割できるエディタ、開発サーバー、テストの出力を並べて見られる
作業環境に戻れる帰宅後に別のPCからSSHして、同じウィンドウ構成の続きから作業できる
コマンドで操作できる画面構成を作るスクリプトを書いて、開発環境を一発で起動できる
複数の作業を並列に見張れるコーディングエージェントをペインごとに動かして、進み具合を並べて確認できる

最後の使い方については、Claude Codeに別のtmuxペインを覗かせる小ネタや、エージェントの監視に特化したターミナルを紹介したcmux入門でも触れています。

サーバーとクライアントの構造

tmuxの動きを理解するうえで一番大事なのは、画面を表示しているプロセスと、シェルを動かしているプロセスが別だという点です。manページには、すべてのセッションは1つのサーバーが管理し、画面はクライアントが表示していて、サーバーと各クライアントは/tmpにあるソケットで通信すると書かれています。

tmuxのプロセスの関係
ターミナルアプリ
  └ tmuxクライアント ──(UNIXドメインソケット)── tmuxサーバー
                                                  ├ シェル(ペイン1)
                                                  ├ シェル(ペイン2)
                                                  └ npm run dev(ペイン3)

tmuxコマンドを実行すると、サーバーがまだ無ければ起動し、クライアントがそのサーバーへ接続します。各ペインの疑似端末を持っているのはサーバーのほうです。

このことは実機で確かめられます。デタッチした状態のセッションでコマンドを動かし、親プロセスを調べました。

サーバーと、ペインで動くプロセスの親子関係を調べる
tmux -L blogtest -f /dev/null new-session -d -s proc 'sleep 300'
tmux -L blogtest display-message -p -t proc '#{pid}'
tmux -L blogtest display-message -p -t proc '#{pane_pid}'
ps -o pid=,ppid=,comm= -p <上のpane_pid>
実行結果(1行目はサーバーのPIDと親PIDを並べたもの)
server pid=29867 ppid=1
29882 29867 sleep

サーバーの親プロセスはPID 1で、どの端末にもぶら下がっていません。そしてsleepの親はサーバーです。

普通にSSHでコマンドを動かしている場合、接続が切れると端末がハングアップし、その端末につながったプロセスはSIGHUPを受け取って終了するのが普通です(シグナルの仕組みはUNIXシグナルとプロセスのライフサイクルを参照してください)。tmuxの中で動かしたプロセスの端末はサーバーが持っている疑似端末なので、クライアントがいなくなっても端末は閉じません。これが、デタッチしても処理が続く理由です。

ソケットは、環境変数TMUX_TMPDIR(未設定なら/tmp)の下のtmux-UIDというディレクトリに作られ、既定の名前はdefaultです。-Lで名前を変えると、別のサーバーを独立して動かせます。

-L blogtest のサーバーのソケット(macOSの実行結果)
/private/tmp/tmux-501/blogtest

インストールとバージョンの確認

macOS(Homebrew)
brew install tmux
Debian / Ubuntu
sudo apt update
sudo apt install tmux
バージョンの確認
tmux -V

2026年11月10日時点の最新の安定版は、GitHub Releasesによると2026年9月9日に公開された3.8で、Homebrewのformulaの安定版も3.8でした(brew info tmuxで確認)。aptで入るバージョンはディストリビューションごとに違うので、tmux -Vで確かめてください。その他の環境は公式のInstallingにまとまっています。

注意: tmux -Vが表示するのはコマンド自身のバージョンです。tmuxをアップグレードしても、動いているサーバーは古いままです。サーバーのバージョンはtmux display-message -p '#{version}'で確認できます。

セッション・ウィンドウ・ペインの3階層

tmuxの画面は3つの階層でできています。

3階層の関係
tmuxサーバー
└ セッション work(作業のまとまり)
   ├ ウィンドウ 0: editor(タブのようなもの)
   │  ├ ペイン 0(分割された端末)
   │  └ ペイン 1
   └ ウィンドウ 1: server
      └ ペイン 0
階層例えるなら役割
セッションプロジェクトごとの机ウィンドウのまとまり。デタッチとアタッチの単位
ウィンドウブラウザのタブ画面全体を占める。1つのセッションに複数持てる
ペインタブの中の分割領域1つの疑似端末。シェルなどが動く実体

実際に3階層を作って一覧を見ると、次のようになります。

セッション、ウィンドウ、ペインを作って一覧する
tmux new-session -d -s demo -x 120 -y 30 -n editor
tmux split-window -h -t demo:editor
tmux split-window -v -t demo:editor.1
tmux new-window -d -t demo -n server
tmux list-panes -a -F '#{session_name}:#{window_index}.#{pane_index} #{pane_current_command} #{pane_width}x#{pane_height}'
実行結果
demo:0.0 zsh 60x30
demo:0.1 zsh 59x15
demo:0.2 zsh 59x14
demo:1.0 zsh 120x30

demo:0.1は「セッションdemoのウィンドウ0のペイン1」を表します。このセッション名、ウィンドウ、ペインの指定は、後で出てくる-tオプションでそのまま使います。

まず覚える操作: 起動、デタッチ、再接続

セッションの基本コマンド
tmux                        # 新しいセッションを作って接続する
tmux new -s work            # 名前を付けて作成する
tmux new -A -s work         # workがあれば接続し、無ければ作成する
tmux ls                     # セッションの一覧
tmux attach                 # 最後のセッションに接続する
tmux attach -t work         # workに接続する
tmux kill-session -t work   # workを終了する
tmux kill-server            # サーバーごと全部終了する

名前を付けておくと、あとで迷いません。同じ名前のセッションを作ろうとすると、duplicate session: demoのようなエラーになります。

セッションから離れるには、Ctrl-bを押してからdを押します。シェルやプログラムはそのまま動き続けます。

いちばん多い使い方は次の流れです。

いつもの流れ
tmux new -A -s work
# ...作業する...
# Ctrl-b → d でデタッチする
# 回線が切れた場合も、もう一度つなぎ直すだけ
tmux new -A -s work

注意: kill-serverは、そのサーバーのセッションをすべて終わらせます。実行中のプログラムも終了するので、使う場面に気を付けてください。

プレフィックスキー

tmuxの操作は、最初にプレフィックスキーを押してから、次のキーを押す2段階で行います。既定のプレフィックスはCtrl-bです。manページなどではC-bと書かれます。

押し方は「Ctrlを押しながらbを押し、指を離してから次のキーを押す」です。同時押しではありません。

キー(Ctrl-bのあと)動作
?キー割り当ての一覧を表示する
/押したキーの割り当てを調べる
:tmuxのコマンドを入力する
dデタッチする
sセッションを選ぶ
$セッションの名前を変える
Ctrl-bCtrl-bそのものをプログラムへ送る

Ctrl-bの後ろに続く:は、コマンドモードです。:resize-pane -L 10のように、この記事で出てくるコマンドは、ここからも実行できます。

ウィンドウの操作

tmux list-keysの結果とmanページから、よく使う既定のキーをまとめました。

キー(Ctrl-bのあと)動作実体のコマンド
c新しいウィンドウを作るnew-window
n次のウィンドウへnext-window
p前のウィンドウへprevious-window
0〜9番号でウィンドウへ移動するselect-window
l直前のウィンドウへ戻るlast-window
wウィンドウを一覧から選ぶchoose-tree -Zw
,ウィンドウの名前を変えるrename-window
&ウィンドウを閉じる(確認あり)kill-window

ペインの分割と移動

キー(Ctrl-bのあと)動作実体のコマンド
"上下に分割するsplit-window
%左右に分割するsplit-window -h
矢印キーその方向のペインへ移動するselect-pane
o次のペインへ移動するselect-pane -t :.+
;直前のペインへ戻るlast-pane
qペイン番号を表示する(番号を押すと移動)display-panes
zペインのズームを切り替えるresize-pane -Z
!ペインを新しいウィンドウに切り出すbreak-pane
xペインを閉じる(確認あり)kill-pane
Spaceレイアウトを順に切り替えるnext-layout
{ / }ペインの位置を入れ替えるswap-pane

"と%はどちらがどちらか、とても間違えやすいキーです。tmux list-keys -Nでは"の説明が「Split window vertically」となっていて、これは画面を上下に分けるという意味です。覚えにくいので、後で紹介する設定で|と-に割り当て直す人が多いです。

ペインのサイズを変える

キー(Ctrl-bのあと)動作
Ctrl+矢印キーその方向へ1セルずつ変える
Alt+矢印キーその方向へ5セルずつ変える

矢印でのペイン移動とサイズ変更のキーは、-r(リピート)付きで割り当てられています。repeat-time(既定は500ミリ秒)の間は、Ctrl-bを押し直さずに続けて操作できます。

キーが使いにくいときは、コマンドで指定できます。

サイズをコマンドで変える
tmux resize-pane -t demo:editor.0 -x 40    # 幅を40列にする
tmux resize-pane -L 10                     # 左へ10列広げる

ズーム

Ctrl-bのあとにzを押すと、今のペインをウィンドウ全体に広げます。もう一度押すと元の分割に戻ります。ログを一時的に大きく見たいときに便利です。

スクロールできないときはコピーモード

tmuxを使い始めて最初につまずくのが、「ターミナルをスクロールしても過去の出力が見えない」という問題です。

原因は、tmuxが画面全体を自分で描き直していて、各ペインの履歴はtmuxの中に持っているからです。公式FAQには、ターミナル側のスクロールバックの内容をtmuxは保証しないと書かれています。過去の出力を見るには、tmuxのコピーモードに入ります。

やりたいことキー
コピーモードに入るCtrl-bのあと[
コピーモードに入って1ページ戻るCtrl-bのあとPageUp
コピーモードを抜けるq

コピーモードの中のキーは、mode-keysの設定で変わります。既定はemacsですが、manページによると環境変数VISUAL(無ければEDITOR)にviという文字列が含まれているとviのキーになります。実機でも、EDITOR=nvimでサーバーを起動するとmode-keysがviになり、EDITOR=nanoではemacsになりました。「人によってキーが違う」という現象の原因はたいていこれです。

操作emacsモードviモード
選択の開始Ctrl-SpaceSpace
コピーして抜けるAlt-wEnter
選択の解除Ctrl-gEscape
上方向に検索Ctrl-r?
下方向に検索Ctrl-s/
次の検索結果n(逆向きはN)n(逆向きはN)
履歴の先頭へ / 末尾へAlt-< / Alt->g / G
1ページ上 / 下Alt-v / Ctrl-v(PageUp / PageDownも可)Ctrl-b / Ctrl-f
行全体の選択既定のキーなしV
矩形選択の切り替えRv または Ctrl-v
抜けるq または Escapeq

コピーした内容はtmuxのペーストバッファに入ります。Ctrl-bのあと]で貼り付けられ、=で過去のバッファから選べます。

注意: viモードの既定では、vは選択の開始ではなく矩形選択の切り替えです。Vimの感覚に合わせるには、後の設定例のようにvを割り当て直します。

mouse onにすると何が変わるか

set -g mouse onを設定すると、マウスの操作をtmuxが受け取るようになります。list-keysで見た既定の動作は次のとおりです。

操作動作
ペインをクリックそのペインを選択する
ステータスラインのウィンドウ名をクリックそのウィンドウへ移動する
ペインの境界線をドラッグペインのサイズを変える
ホイールを上へコピーモードに入ってスクロールする
ペインの中をドラッグ選択してコピーする

ホイールの動作は、実行中のプログラムによって変わります。

ホイールの既定の割り当て(list-keys -T root)
WheelUpPane if-shell -F "#{||:#{alternate_on},#{pane_in_mode},#{mouse_any_flag}}" { send-keys -M } { copy-mode -e }

Vimやlessのように代替画面を使っているプログラムや、マウスを要求しているプログラムにはイベントを渡し、そうでなければコピーモードに入ります。-eが付いているので、一番下までスクロールすると自動でコピーモードを抜けます。

WARNING

mouseの既定値は、tmux 3.8からオンに変わりました(CHANGES、3.8についてのissue)。手元の3.6aでは既定はオフです。バージョンアップ後に「マウスで文字が選択できなくなった」と感じたら、この変更が原因かもしれません。元に戻すにはset -g mouse offを設定します。

mouseがオンのときにターミナル本来の選択を使いたいときは、修飾キーを押しながら操作します。公式FAQでは、LinuxのターミナルではShift、iTerm2ではOptionと案内されています。

なお、3.6からはpane-scrollbarsオプションで、ペインごとにスクロールバーを表示できるようになりました。

クリップボードとの連携

tmuxのペーストバッファは、OSのクリップボードとは別のものです。OSのクリップボードへ送る方法は2つあります。

OSC 52(SSH越しでも使える)

OSC 52は、ターミナルにクリップボードの設定を頼むエスケープシーケンスです。公式WikiのClipboardによると、X11転送を設定しなくてもSSH越しに使えるのが利点で、動かすには次の3つの条件が必要です。

  1. set-clipboardがonまたはexternalになっている
  2. 外側のターミナルのTERMのterminfoにMsがある(xterm*には既定で追加される)
  3. ターミナル自身でOSC 52が有効になっている

set-clipboardの値の意味は次のとおりです。3.6aの既定値はexternalでした。

値動作
ontmuxがクリップボードを設定し、tmux内のプログラムからの設定も受け付ける
externaltmuxがクリップボードを設定する。tmux内のプログラムからのバッファ作成は無視する
offどちらも行わない

注意: Wikiは、onにするとtmux内のどのプログラムでもクリップボードを書き換えられるので、信頼できないコマンドを動かすときは注意するよう書いています。特に理由がなければ、既定のexternalのままで十分です。

ターミナル側の対応にはばらつきがあります。iTerm2は環境設定で有効にする必要があり、VTE系(GNOME Terminalなど)は非対応だとWikiに書かれています。Msがあるかどうかは次のコマンドで確認できます。

Msの確認
tmux info | grep Ms
実行結果(xterm-256colorのクライアント)
193: Ms: (string) \033]52;%p1%s;%p2%s\a

外部コマンド(macOSならpbcopy)

ローカルのmacOSでは、pbcopyにパイプする方法が確実です。tmux 3.2以降はcopy-commandオプションで指定できます。

tmux.conf
set -s copy-command 'pbcopy'

copy-commandは、copy-pipe系のコマンドが引数なしで実行されたときの渡し先です。Enter(viモード)やAlt-w(emacsモード)、マウスのドラッグの既定の割り当ては引数なしのcopy-pipe-and-cancelなので、これだけで動きます。実機でも、copy-commandにcatを指定してコピーモードで1行選択し、copy-pipe-and-cancelを実行すると、選択した行がファイルに書き出されました。

一方でcopy-selection-and-cancelはペーストバッファへのコピーだけで、copy-commandには渡らないので、自分でキーを割り当てるときはcopy-pipe-and-cancelを使います。

Linuxではxselやxclipを同じように指定します。これらはXサーバーに接続するので、基本的にローカルでのみ使えます。またpbcopyもSSH先ではローカルのクリップボードに届かないので、SSH先ではOSC 52を使います。

補足: Wikiは、copy-pipeとset-clipboardが競合する場合はset-clipboard offにするよう案内しています。

tmux.confの設定

どのファイルが読まれるか

manページには、システムの設定ファイルのあとに~/.tmux.confまたは$XDG_CONFIG_HOME/tmux/tmux.confを読むと書かれていて、FILESの節には~/.config/tmux/tmux.confも載っています。

では、複数あるとどうなるのかを、Homebrew版3.6aで試しました。バイナリに埋め込まれている検索パスは次のとおりです(システムの設定ファイルの場所はビルドによって違います)。

tmuxのバイナリの中の検索パス(strings の結果)
/opt/homebrew/etc/tmux.conf:~/.tmux.conf:$XDG_CONFIG_HOME/tmux/tmux.conf:~/.config/tmux/tmux.conf

3つのファイルすべてに違う値を書いて起動すると、すべてのファイルが読み込まれ、この順に後のファイルの設定で上書きされました。

3つのファイルを置いて確認した結果
@from_dot=yes         # ~/.tmux.conf も読まれた
@from_xdg=yes         # $XDG_CONFIG_HOME/tmux/tmux.conf も読まれた
@from_cfg=yes         # ~/.config/tmux/tmux.conf も読まれた
@who=dotconfig        # 同じ設定は ~/.config/tmux/tmux.conf が最後に勝つ

「どちらか一方だけが読まれる」わけではないので、設定ファイルは1か所にまとめておくのが安全です。

また、manページによると、設定ファイルを読むのはサーバーの起動時の1回だけです。編集しただけでは反映されません。

設定例

最初に手を入れることの多い項目をまとめました。自分に必要なものだけ取り入れてください。全体をtmux 3.6aで読み込み、エラーが出ないことを確認しています。

~/.tmux.conf
# プレフィックスを Ctrl-a に変える
unbind C-b
set -g prefix C-a
bind C-a send-prefix
 
# マウスを使う(3.8以降は既定でオン)
set -g mouse on
 
# ウィンドウとペインの番号を1から始める
set -g base-index 1
setw -g pane-base-index 1
 
# ウィンドウを閉じたら番号を詰める
set -g renumber-windows on
 
# スクロールバックを増やす(既定は2000行)
set -g history-limit 50000
 
# Escの待ち時間(ミリ秒)
set -s escape-time 10
 
# コピーモードをviキーにする
setw -g mode-keys vi
 
# フォーカスの変化をNeovimなどのプログラムへ渡す
set -g focus-events on
 
# True Color
set -g default-terminal "tmux-256color"
set -as terminal-features ",xterm-256color:RGB"
 
# 分割キーを | と - にして、今のディレクトリを引き継ぐ
bind | split-window -h -c "#{pane_current_path}"
bind - split-window -v -c "#{pane_current_path}"
bind c new-window -c "#{pane_current_path}"
 
# hjklでサイズを変える
bind -r H resize-pane -L 5
bind -r J resize-pane -D 5
bind -r K resize-pane -U 5
bind -r L resize-pane -R 5
 
# Vimに近いコピー操作
bind -T copy-mode-vi v send-keys -X begin-selection
bind -T copy-mode-vi C-v send-keys -X rectangle-toggle
bind -T copy-mode-vi y send-keys -X copy-pipe-and-cancel
 
# macOSのクリップボードへ送る
set -s copy-command 'pbcopy'
 
# prefix + r で再読み込み
bind r source-file ~/.tmux.conf \; display-message "tmux.conf reloaded"
 
# ステータスライン
set -g status-position bottom
set -g status-interval 5
set -g status-style "bg=colour236,fg=colour252"
set -g status-left "[#S] "
set -g status-left-length 20
set -g status-right "%Y-%m-%d %H:%M"
setw -g window-status-current-style "bold,fg=colour81"

各設定の意味

設定意味3.6aの既定値
prefixプレフィックスキーC-b
mouseマウス操作の有効化(3.8で既定がオンに変更)off
base-indexウィンドウ番号の開始値0
pane-base-indexペイン番号の開始値0
renumber-windowsウィンドウを閉じたときに番号を詰めるoff
history-limitペインごとの履歴の行数2000
escape-timeEscに続く入力を待つ時間(ミリ秒)10
mode-keysコピーモードのキー(viまたはemacs)emacs
focus-eventsフォーカスの変化をプログラムへ渡すoff
default-terminalペインの中のTERMの値tmux-256color(ビルドによる)
set-clipboardクリップボード連携の動作external
status-intervalステータスラインの更新間隔(秒)15

個別に補足します。

  • bind C-a send-prefix: プレフィックスを2回押すと、Ctrl-aそのものをシェルへ送れるようにします。Ctrl-aはシェルで行頭へ移動するキーとしても使うので、この行が必要です。
  • base-index 1: キーボードの並びで、左端の1から使いたい場合に設定します。0は右端にあって遠いからです。
  • history-limit: 3.6aのmanページでは、設定変更は新しいウィンドウにだけ効くとされています。3.7からは既存のペインにも適用されるようになりました(CHANGES)。
  • -cと#{pane_current_path}: split-windowは-cを付けないと、セッションを作成したときのディレクトリで開きます。付けると今のペインのディレクトリを引き継ぎます。実機では次の差になりました。
cd /tmp のペインから分割した結果
# -c "#{pane_current_path}" を付けた場合
1 /private/tmp
 
# -c を付けない場合(セッションを作ったディレクトリのまま)
1 (セッションを作ったときのディレクトリ)

再読み込み

設定を編集したら、動いているサーバーに読み込ませます。

設定の再読み込み
tmux source-file ~/.tmux.conf

上の例のキー割り当てがあれば、プレフィックスのあとにrで実行できます。Ctrl-bのあと:を押してsource-file ~/.tmux.confと入力しても構いません。

書いた内容の文法だけを確かめたいときは、-nを付けます。manページには、ファイルを解析するがコマンドは実行しないと書かれています。

構文のチェックだけ行う
tmux source-file -n ~/.tmux.conf

注意: source-fileは書かれたコマンドを実行するだけです。設定ファイルから行を消しても、すでに反映された値は元に戻りません。戻したいときはset -uで設定を解除するか、サーバーを再起動します。

コマンドで自動化する

tmuxの操作はすべてコマンドとして実行でき、スクリプトから呼べます。

開発環境を起動するスクリプト

new-session -dでセッションをバックグラウンドで作り、ウィンドウやペインを組み立ててから接続します。

dev.sh
#!/usr/bin/env bash
set -euo pipefail
 
SESSION="myapp"
PROJECT_DIR="$HOME/work/sample-app"
 
attach() {
  if [ -n "${TMUX:-}" ]; then
    tmux switch-client -t "=$SESSION"
  else
    tmux attach -t "=$SESSION"
  fi
}
 
if tmux has-session -t "=$SESSION" 2>/dev/null; then
  attach
  exit 0
fi
 
tmux new-session -d -s "$SESSION" -n editor -c "$PROJECT_DIR"
tmux send-keys -t "=$SESSION:editor" 'nvim .' Enter
 
tmux new-window -d -t "=$SESSION" -n dev -c "$PROJECT_DIR"
tmux send-keys -t "=$SESSION:dev" 'npm run dev' Enter
 
TEST_PANE=$(tmux split-window -v -P -F '#{pane_id}' -t "=$SESSION:dev" -c "$PROJECT_DIR")
tmux send-keys -t "$TEST_PANE" 'npm test -- --watch' Enter
 
tmux select-window -t "=$SESSION:editor"
attach

ポイントは次のとおりです。

  • =を付けると、セッション名を完全一致で探します。付けないと前方一致でも見つかるので、myがmyappに当たることがあります。
  • ウィンドウは番号ではなく名前(editorやdev)で指定しています。base-indexの設定に左右されません。
  • split-window -P -F '#{pane_id}'で新しいペインのIDを受け取り、それをsend-keysの宛先にしています。ペイン番号はpane-base-indexで変わりますが、IDなら確実です。
  • 既にtmuxの中で実行したときは、attachではなくswitch-clientを使います。tmuxの中でattachすると、後述のネストのエラーになるからです。

実行結果は次のとおりです(nvimやnpmをechoに差し替え、最後の接続を除いて確認しました)。2回目の実行では、作り直さずに既存のセッションへ分岐しました。

実行結果
0 editor 1
1 dev 2

send-keysは、指定したペインへキー入力を送ります。Enterのように特別なキーは名前で指定し、文字列はそのまま入力されます。

capture-paneでペインの中身を取り出す

ペインに表示されている文字を、コマンドで取得できます。

capture-paneの使い方
tmux capture-pane -p -t myapp:dev.0              # 見えている範囲を標準出力へ
tmux capture-pane -p -S -3 -t myapp:dev.0        # 3行前の履歴から
tmux capture-pane -p -S - -t myapp:dev.0         # 履歴の先頭から全部
tmux capture-pane -p -J -S - -t myapp:dev.0      # 折り返された行を1行につなげる
オプション意味
-pバッファではなく標準出力に出す
-t対象のペイン
-S / -E開始行と終了行。0が見えている先頭の行で、負の数は履歴。-S -は履歴の先頭
-J折り返された行をつなげる(末尾の空白も保持)
-e色などのエスケープシーケンスも含める

たとえばseq 1 100を実行したペインでcapture-pane -p -S -を実行すると、1から100までの全行を取得できました。

AIのコーディングエージェントにほかのペインの様子を見せるときにも、この仕組みが使えます。具体例はClaude Codeに別のtmuxペインを覗かせる小ネタを参照してください。

ほかにも、次のような確認にlist-panesとdisplay-messageのフォーマットが使えます。

今の状態をコマンドで調べる
tmux list-panes -a -F '#{session_name}:#{window_index}.#{pane_index} #{pane_current_command}'
tmux display-message -p '#{socket_path}'

SSH先での使い方

tmuxが一番役に立つのはSSH先です。接続先のサーバーでtmuxを起動すれば、手元のPCとの接続が切れても処理が続きます。SSHの仕組みはSSHの仕組みで解説しています。

SSHしたらtmuxに入る
ssh example-server
tmux new -A -s work

1行で済ませたいときは、-tで端末の割り当てを強制します。

SSHと同時に接続する
ssh -t example-server tmux new -A -s work

-tを付けないと、tmuxが端末を開けずopen terminal failed: not a terminalになります。

接続が切れたら、もう一度SSHして同じコマンドを実行します。manページにあるとおり、セッションはSSHのタイムアウトのような不意の切断でも残り続けます。

tmuxの中でtmuxを動かす(ネスト)

tmuxの中でさらにtmuxを実行すると、次のエラーが出ます。

実行結果
sessions should be nested with care, unset $TMUX to force

tmuxの中のペインでは、環境変数TMUXが設定されています。メッセージのとおりTMUXを消せば強制できますが、別のセッションへ移りたいだけなら、ネストする必要はありません。

別のセッションへ移る
tmux new-session -d -s other
tmux switch-client -t other

Ctrl-bのあとsで、一覧から選ぶこともできます。

手元のtmuxの中からSSHして、接続先でもtmuxを使うという形のネストはよくあります。この場合、キーは外側のtmuxが先に受け取ります。内側のtmuxを操作するにはCtrl-bを2回押します(1回目は外側が受け取って、send-prefixで内側へCtrl-bを送ります)。手元と接続先でプレフィックスを変えておくと、混乱が減ります。

再起動するとセッションは消える

tmuxのセッションはサーバープロセスのメモリの中にあるので、OSの再起動やサーバーの終了で消えます。すべてのセッションが閉じたときもサーバーは終了します(exit-emptyの既定の動作)。

保存と復元を行うのが、次のプラグインです。どれもリポジトリは公開が続いていて、アーカイブされていません(GitHub APIで2026年11月10日に確認)。最終更新は、TPMが2026年5月、resurrectとcontinuumは2024年8月でした。

プラグイン役割
TPMtmuxのプラグインマネージャー。要件はtmux 1.9以上、git、bash
tmux-resurrectセッション、ウィンドウ、ペインの構成と作業ディレクトリ、一部のプログラムを保存と復元する
tmux-continuumtmux-resurrectの保存を15分ごとに自動で行う。起動時の自動復元もできる
TPMのインストール
git clone https://github.com/tmux-plugins/tpm ~/.tmux/plugins/tpm
tmux.confの末尾に追記
set -g @plugin 'tmux-plugins/tpm'
set -g @plugin 'tmux-plugins/tmux-resurrect'
set -g @plugin 'tmux-plugins/tmux-continuum'
 
# 起動時に自動で復元する場合
set -g @continuum-restore 'on'
 
# この行は必ずファイルの一番下に置く
run '~/.tmux/plugins/tpm/tpm'

設定を読み込んだら、プレフィックスのあとにI(大文字)でプラグインをインストールします。Uで更新です。

tmux-resurrectの操作は、プレフィックスのあとのCtrl-sで保存、Ctrl-rで復元です。

注意: 復元されるプログラムは、既定ではvi、vim、nvim、emacs、man、less、more、tail、top、htopなどの限られたものだけです。開発サーバーのようなプログラムは自動では再開されないので、前述の起動スクリプトと使い分けるのが現実的です。

Neovimと組み合わせるときの注意

Neovimの:checkhealthには、tmuxの設定を調べる項目があります。Neovim 0.11.6で、何も設定していないtmux 3.6aのペインから確認した結果が次の部分です。

:checkhealth vim.health の tmux の項目(抜粋)
tmux
- OK escape-time: 10
- WARNING `focus-events` is not enabled. |'autoread'| may not work.
  - ADVICE:
    - (tmux 1.9+ only) Set `focus-events` in ~/.tmux.conf:
      set-option -g focus-events on
- $TERM: tmux-256color

Neovimのソースでは、次のことを確かめています。

確認する項目指摘の内容
escape-time300ミリ秒を超えているとエラー。set-option -sg escape-time 10を提案
focus-eventsonでないと警告。autoreadが動かない可能性がある
default-terminalと$TERM不一致だと色がおかしくなる可能性を指摘する
$TERMscreen-256color、tmux-256color、tmux-directのどれかであることを確認する
True Colortmux show-messages -Tにsetrgbbとsetrgbfがあるか調べ、無ければ設定を提案する

対応する設定は次のとおりです(xterm-256colorの部分は、tmuxの外でecho $TERMした値にします)。

Neovimのためのtmux.conf
set -s escape-time 10
set -g focus-events on
set -g default-terminal "tmux-256color"
set -as terminal-features ",xterm-256color:RGB"
  • Esc: NeovimのFAQは、escape-timeを低い値(10〜20ミリ秒)にするよう案内しています。
  • focus-events: manページによると、変更後はクライアントのデタッチと再アタッチが必要です。
  • True Color: terminal-featuresはtmux 3.2以降の書き方です。それより古いtmuxではterminal-overridesにTcを指定します。

True Colorが効いているかは、tmuxの中で次のコマンドを実行して確かめられます。

True Colorの確認
tmux display-message -p '#{client_termfeatures}'
tmux show-messages -T | grep -E 'setrgb|RGB'
実行結果(xterm-256colorのクライアント、抜粋)
256,bpaste,ccolour,clipboard,hyperlinks,cstyle,focus,mouse,overline,RGB,strikethrough,title,usstyle
209: setrgbb: (string) \033[48;2;%p1%d;%p2%d;%p3%dm
210: setrgbf: (string) \033[38;2;%p1%d;%p2%d;%p3%dm

setrgbbとsetrgbfがあれば、RGBの色を出せます。tmuxがターミナルから機能を検出できる場合は、terminal-featuresを書かなくてもRGBが有効になることがあります(今回の実機確認がそのケースでした)。

トラブルシューティング

色がおかしい

次の順に確認します。

  1. tmuxの中でecho $TERMを実行して、tmux-256colorやscreen-256colorになっているか確認する。manページはdefault-terminalにscreen、tmuxまたはその派生を指定するよう求めています。
  2. tmuxの外でecho $TERMを実行し、その値でterminal-featuresにRGBを追加する。
  3. 設定を変えたあと、サーバーを再起動する(tmux kill-server)。公式WikiのClipboardのページも、terminal-featuresなどを変更したあとはtmux kill-serverで完全に再起動するよう案内しています。

公式FAQによると、screen系のTERMでは斜体が無効になるので、斜体を使いたいときはtmux系を使います。

Escの反応が遅い

escape-timeが長いと、Vimなどでインサートモードを抜けるときに待たされます。tmuxはEscに続けて別の文字が届くかどうかを待って、単独のEscキーなのか、Escで始まる特殊キーなのかを判断しているからです。

set -s escape-time 10を設定します。公式FAQでは、端末と同じマシンや速いネットワークなら0でも問題なく、遅いネットワークでは大きめの値が適していると説明されています。

sessions should be nested with care

tmuxの中でtmuxを起動しようとしたときのメッセージです。上の「ネスト」の節のとおり、別のセッションへ移りたいだけならswitch-clientかCtrl-bのあとsを使います。別のサーバーを起動したい理由があるときは、env -u TMUX tmux -L otherのようにソケットを分けます。

no server running on ...

tmux lsなどで、次のように表示される場合です。

実行結果
no server running on /private/tmp/tmux-501/blogtest

このソケットのサーバーが動いていないという意味です。次の可能性があります。

  • すべてのセッションが終わってサーバーも終了した(exit-empty)
  • OSを再起動した
  • -Lや-S、TMUX_TMPDIRの違いで、別のソケットを見ている
  • /tmpのソケットファイルが消えた

最後の場合はプロセスは生きています。manページとFAQによると、サーバーにSIGUSR1を送るとソケットを作り直せます。

ソケットを作り直す
pgrep -l tmux
pkill -USR1 tmux

open terminal failed

tmuxが端末を初期化できないときのエラーで、後ろの文言で原因が分かります。手元で再現した例です。

メッセージ状況対処
open terminal failed: not a terminalcronやパイプなど端末がない環境、sshで-tを付けないときssh -tを使う。スクリプトならnew-session -dにする
open terminal failed: terminal does not support clearTERMが空やdumbなどのときTERMを正しく設定する
missing or unsuitable terminal: notexist-termTERMに対応するterminfoが無いときterminfoを入れる、またはTERMを変える

最後のエラーは、SSH先で起きやすいものです。手元のターミナルが独自のTERM(Ghosttyのxterm-ghosttyなど)を使っていて、接続先にそのterminfoが無いと発生します。とりあえず動かすには、TERMを変えて接続します。

TERMを指定してSSHする
TERM=xterm-256color ssh example-server

設定を変えたのに反映されない

設定ファイルを読むのはサーバーの起動時だけです。source-fileで読み込むか、tmux kill-serverでサーバーを再起動します。読み込むファイルが複数あるときは、「どのファイルが読まれるか」の節のとおり、後のファイルに上書きされていないか確認してください。

日本語が文字化けする、_になる

公式FAQによると、tmuxは環境変数LC_ALL、LC_CTYPE、LANGからターミナルのUTF-8対応を判断し、非対応と判断すると文字を_に置き換えます。ロケールの設定を見直すか、tmux -uで強制的にUTF-8で出力します。

screen、Zellij、WezTermとの違い

同じことができるツールはほかにもあります。確認できた範囲で、短く比べます。

ツール形態特徴
tmuxターミナルマルチプレクサ(サーバーとクライアント)SSH先でも動く。コマンドでの操作が充実している
GNU screenターミナルマルチプレクサCtrl-aがプレフィックス。-Sで名前を付け、-rで再接続する(man screenで確認)。手元のmacOSの/usr/bin/screenは4.00.03でした
ZellijターミナルマルチプレクサレイアウトはKDLファイルで書く。セッションの復元が既定で有効
WezTermマルチプレクサ機能を持つターミナルアプリunixドメイン、SSHドメイン、TLSドメインに接続する。SSHドメインでは接続先にも互換性のあるWezTermが必要

サーバーにtmuxかscreenだけ入れておけば、手元のターミナルアプリを問わずに使い続けられるのが、ターミナルの外にあるマルチプレクサの強みです。

まとめ

  • tmuxは、サーバーがペインの疑似端末を持っているので、クライアントが切れても中のプログラムは動き続けます。
  • 階層はセッション、ウィンドウ、ペインの3つ。tmux new -A -s workで作成と再接続が1つのコマンドで済みます。
  • スクロールできないときはCtrl-bのあと[でコピーモードに入ります。キーはmode-keysで変わり、EDITORの値にも左右されます。
  • mouseの既定はtmux 3.8からオンです。バージョンで挙動が違う点に注意してください。
  • 設定ファイルは複数あるとすべて読まれて上書きされるので1か所にまとめ、変更後はsource-fileで読み込みます。
  • 再起動するとセッションは消えます。必要ならtmux-resurrectとtmux-continuum、あるいは起動スクリプトを使います。

参考リンク

パイプとリダイレクトの仕組み - 2>&1の意味をファイルディスクリプタから理解する

パイプとリダイレクトの仕組み - 2>&1の意味をファイルディスクリプタから理解する

約46分

2>&1は「標準エラー出力を、今の標準出力の行き先に複製する」という意味です。ファイルディスクリプタとopen file descriptionの関係、シェルがforkとexecの間でopenとdup2を行う流れ、> file 2>&1と2>&1 > fileの結果が違う理由を段階ごとの表で説明します。パイプの容量やSIGPIPE、PIPESTATUSとpipefail、stdioのバッファリングで出力順が入れ替わる現象、sudo echoやsort file > fileの失敗、bashとzshとPOSIXの違いまで、実行結果付きで整理します。

crontabの書き方入門 - cronの5つのフィールドと、動かないときに見る実行環境・ログ・二重起動

crontabの書き方入門 - cronの5つのフィールドと、動かないときに見る実行環境・ログ・二重起動

約26分

crontabは「分 時 日 月 曜日 コマンド」の1行で、決まった時刻にコマンドを動かす設定ファイルです。5つのフィールドと特殊文字(* , - /)の読み方、日と曜日を両方指定したときのOR条件、@dailyなどの短縮表記、crontab -eと/etc/cron.dの違い、PATHや%の落とし穴、タイムゾーン、ログの見方、flockによる二重起動の防止、systemd timerやGitHub Actionsのscheduleとの違いを、crontab(5)などのmanページを一次ソースに、cron式を試せるデモ付きで整理します。

楽天市場のおすすめPR / 楽天アフィリエイト