[macOS] Terminalからクリップボードを操作する - pbcopy, pbpaste

macOSオリジナルのコマンドでクリップボードを操作できる pbcopy, pbpasteの2つのコマンドを覚えておくと、毎回マウス(トラックパッド)で選択してCommand+Cとかする必要がないので楽ちんです。

コピー

$ date | pbcopy

ペースト

$ pbpaste
202019日 木曜日 222649秒 JST

利用方法

基本的な使い方

クリップボードにコピーするためには、パイプでpbcopyに渡すだけ。パイプではなくリダイレクトをするとpbcopyという名前のファイルが作成されますのでご注意を(←よくやるw)

$ echo "Ghosn has gone" | pbcopy

クリップボードから取り出してペーストしたいときはpbpasteコマンドを実行するだけです。

$ pbpaste
Ghosn has gone

単にペーストするならCommand+Vした方が手っ取り早いわけですが、要は他のコマンドと組み合わせて使えるって話ですね。例えばクリップボード内の文章に特定の文字列がいくつ含まれるかカウントする際、一時的なファイルを用意すること無くサクッと実現できます。

$ pbpaste | grep "" | wc -l
     103

クリップボードへファイルの内容をコピー

これまで通りパイプで渡しても良いですし、リダイレクトしても同様の結果になります。

$ cat foo.txt | pbcopy
$ pbcopy < foo.txt

クリップボードを空にする

「空」のデータをpbcopyに渡してやります。お好きな方法でどうぞ。

$ pbcopy < /dev/null
$ cat /dev/null | pbcopy
$ echo -n | pbcopy 

クリップボードから書式情報を削除する

ペーストする際に-Preferオプションを付けると、データ形式を指定することができるので、これを利用してやります。以下の例では「テキスト形式」で出力しそのままpbpasteに渡すことで余計な書式情報を削除することができます。

$ pbpaste -Prefer txt | pbcopy

-Preferオプションはこの他にも以下のような物があります。

オプション 説明
txt テキスト形式
rtf リッチテキスト形式
ps PostScript

-Preferオプションはpbpasteのみ利用可能ですのでご注意を。

注意点

バイナリは扱えない

一部の例外を除き画像などのバイナリは扱えないようです。

DESCRIPTION The input is placed in the pasteboard as plain text data unless it begins with the Encapsulated PostScript (EPS) file header or the Rich Text Format (RTF) file header, in which case it is placed in the pasteboard as one of those data types.

man pbcopyより

文字コードが自動変換される

pbcopy/pbpasteは文字コードを勝手に変換してしまう仕様になっています。実験用にシフトJIS形式のテキストファイルを用意しました。

$ cat foo.txt | nkf --guess
Shift_JIS

このファイルをpbcopyに食べさせ、pbpasteで呼び出すと最終的にUTF-8形式に変換されてしまいました。

$ pbcopy < foo.txt
$ pbpaste | nkf --guess
UTF-8

これは環境変数LANGの設定値により変換される文字コードが決まるようです。

DESCRIPTION pbcopy and pbpaste use locale environment variables to determine the encoding to be used for input and output. For example, absent other locale settings, setting the environment variable LANG=en_US.UTF-8 will cause pbcopy and pbpaste to use UTF-8 for input and output. If an encoding cannot be determined from the locale, the standard C encoding will be used.

man pbcopyより

試しに環境変数をShiftJISに変更して実行すると今度はシフトJISになりました。

$ export LANG=ja_JP.ShiftJIS

$ pbcopy < foo.txt 
$ pbpaste | nkf --guess
Shift_JIS

文字コードが変わると困るような用途では注意する必要がありますね。

おまけ

「pb」ってなんやねん

ちなみに頭に付いているpbpasteboardの略称だと思われます。macOSやiOS上ではクリップボードのことを「ペーストボード」と呼称するようです。

Apple iOS The clipboard is called "pasteboard" in iOS similar to OS X.

Wikipedia Clipboard (computing)

macOSに付いてくるアクティビティモニタで確認すると、pboradというプロセスがいますがこいつがクリップボード…もといペーストボードを管理しているようですね。

参考ページ