「長いワンライナーをターミナルからコピーして貼り付けたら、途中に改行が入って別々のコマンドとして実行されてしまった」「メモに貼ったコマンドが画面幅のところでブツブツ切れている」「\ で続けたコマンドをコピーしたら > が混ざって動かない」——ターミナルで長いコマンドを扱っていると、必ず一度はぶつかる詰まりです。
原因はコマンドでもシェルでもなく、「画面に折り返して表示されたもの」をコピーしていることです。画面上の折り返し(ソフトラップ)は見た目だけの改行ですが、コピーの経路によってはそれが本物の改行(ハードラップ)としてクリップボードに入ります。
この記事では、いちばん確実な「画面からコピーしない」方法(履歴→クリップボード直行)、tmux で折り返しを結合してコピーする方法、貼り付け側での事故防止までをまとめます。
- 改行が入るのは「画面の折り返し」をコピーしているから。画面からコピーしないのが最短の解決
- 直前のコマンドは
fc -ln -1 で取れる。fc -ln -1 | sed 's/^[[:space:]]*//' | xclip -selection clipboard で改行なしのままクリップボードへ - tmux は
tmux capture-pane -p -J の `-J` が折り返しを1行に結合してくれる - コマンドの出力を渡したいときも
コマンド | xclip -selection clipboard でマウスを使わない - 貼り付け事故(改行で勝手に実行)は bracketed paste が有効なら防げる(最近の bash/zsh は既定で有効)
目次を開く
なぜコピーすると改行が入るのか
ターミナルは、ウィンドウ幅より長い行を折り返して表示します。この折り返しはあくまで表示上のもので、シェルの履歴には1行のまま残っています。
問題は、マウス選択でコピーするときです。
| コピー元 | 折り返しの扱い |
|---|---|
| モダンな端末エミュレータ(GNOME端末・iTerm2 など)で素直に選択 | 多くは1行に復元してくれる |
| tmux / GNU screen のコピーモード | 折り返し位置で改行が入ることがある |
| ウィンドウ幅を変えた後の画面・ページャ(less)越し | 改行が入りやすい |
\ で行継続したコマンドの画面表示 | 継続プロンプト > ごとコピーされて壊れる |
つまり「端末やtmuxの設定を頑張って直す」よりも、画面を経由せずにクリップボードへ渡すほうが確実です。次章から順に見ていきます。
解決1(最短): 履歴からクリップボードへ直行する
シェルの履歴には折り返しのない「本物の1行」が残っています。直前に実行したコマンドは fc -ln -1 で取り出せます。
# 直前のコマンドを、改行なしのままクリップボードへ(X11環境)
fc -ln -1 | sed 's/^[[:space:]]*//' | tr -d '\n' | xclip -selection clipboard -
fc -ln -1… 履歴の最後の1件を、行番号なし(-n)で表示する -
sed 's/^[[:space:]]*//'… 先頭に付く空白を除去 -
tr -d '\n'… 末尾の改行も落とし、貼り付けた瞬間に実行されるのを防ぐ
毎回打つものではないので、エイリアスにしておきます。
# ~/.bashrc / ~/.zshrc
alias cplast="fc -ln -1 | sed 's/^[[:space:]]*//' | tr -d '\n' | xclip -selection clipboard" これで「実行してうまくいったコマンドを cplast → メモやチャットに貼る」が改行事故ゼロで回ります。
クリップボードコマンドは環境で変わる
xclip の部分は環境に合わせて読み替えてください。
| 環境 | コマンド |
|---|---|
| Linux(X11) | xclip -selection clipboard(または xsel --clipboard --input) |
| Linux(Wayland) | wl-copy |
| macOS | pbcopy |
| WSL(Windows) | clip.exe |
# 例: WSLなら
alias cplast="fc -ln -1 | sed 's/^[[:space:]]*//' | tr -d '\n' | clip.exe" コマンドの「出力」を渡したいときも同じ
ログやトークンのような長い出力をコピーするときも、マウス選択をやめてパイプで渡せば折り返しは入りません。
cat 長いログ.txt | xclip -selection clipboard
git diff | wl-copy 解決2: tmux なら capture-pane -J で折り返しを結合できる
tmux のコピーモードで長い行を選択すると、折り返し位置に改行が入った状態でバッファに入ることがあります。tmux には折り返された行を1行に結合(join)するオプション `-J` が用意されているので、画面の内容をまとめて取りたいときはこちらを使います。
# 表示中のペインの内容を、折り返しを結合してクリップボードへ
tmux capture-pane -p -J | xclip -selection clipboard
# 直近500行ぶんまとめて取りたいとき
tmux capture-pane -p -J -S -500 | xclip -selection clipboard -
-p… バッファではなく標準出力に出す(パイプに渡せる) -
-J… 折り返し行を結合する(これが本題) -
-S -500… さかのぼる行数
「tmuxの中で作業した内容をコピーすると改行だらけになる」問題は、コピーモードで頑張るより capture-pane -p -J を1本エイリアスにしておくほうが確実です。
解決3: 貼り付け側の事故を防ぐ
コピーの時点で改行が混ざってしまった場合でも、貼り付けで即実行される事故は防げます。
bracketed paste(囲み貼り付け)
最近の bash(5.1以降で既定有効)と zsh は bracketed paste に対応しており、複数行を貼り付けてもEnterを押すまで実行されません。貼り付けた瞬間に1行目から順に実行されてしまう環境は、これが無効になっています。
# bash で明示的に有効化する場合(~/.inputrc)
set enable-bracketed-paste on 長いコマンドはエディタで組み立てる
編集中の長いコマンドは Ctrl+X Ctrl+E でエディタ($EDITOR)が開き、複数行で安全に編集してから実行できます。貼り付け先としても改行事故がありません。
解決4: そもそも「画面の1行」に依存しない書き方にする
- 何度も使うワンライナーは、シェル関数かスクリプトにする。コピーで運ぶ運用自体をやめるのがいちばん壊れません。
-
\で行継続して書いたコマンドは、画面からコピーすると継続プロンプト>が混ざります。履歴から取れば `\` 継続も1行にまとまっているので、この場合もcplastが有効です(bash はcmdhistが既定で有効のため、複数行コマンドは履歴上1行に畳まれます)。
まとめ
| 場面 | 対策 | |
|---|---|---|
| 実行済みコマンドをコピーしたい | fc -ln -1 → クリップボードコマンドへパイプ(cplast エイリアス) | |
| コマンドの出力をコピーしたい | `コマンド \ | xclip -selection clipboard` 等でマウスを使わない |
| tmux の画面内容をコピーしたい | tmux capture-pane -p -J(-J で折り返しを結合) | |
| 貼り付けで勝手に実行される | bracketed paste を有効化。長い編集は Ctrl+X Ctrl+E |
「改行が入ってしまう」は端末の見た目の問題ではなくコピー経路の選び方の問題です。画面からコピーしない習慣にしてしまえば、ほぼ根絶できます。
よくある質問(FAQ)
Q. コピーしたコマンドに > がいくつも混ざるのはなぜ?
\ で行継続したコマンドを画面から選択すると、シェルの継続プロンプト(PS2、既定は > )ごとコピーされるためです。履歴(fc -ln -1)から取れば継続プロンプトは含まれません。
Q. 貼り付けた瞬間に途中まで実行されてしまいました
改行を含むテキストを bracketed paste が無効な環境に貼ると、改行のたびにEnter扱いで実行されます。bash 5.1以降・zsh では既定で有効です。古い bash では ~/.inputrc に set enable-bracketed-paste on を追記してください。
Q. WSL でクリップボードに入れるには?
Windows 側の clip.exe にパイプすれば、WSL 内から Windows のクリップボードへ直接入ります(fc -ln -1 | clip.exe)。逆に貼り付け(読み取り)は powershell.exe -command Get-Clipboard が使えます。
Q. マウスで選択したときだけ改行が入るのはなぜ?
マウス選択は「画面に描画された文字」を拾うため、表示上の折り返しがそのまま改行として入ることがあります。パイプや履歴経由は画面を経由しないため、折り返しの影響を受けません。
