xcrun simctl pbsyncは、あるペーストボードの内容を別のペーストボードへ同期するサブコマンドである。

参考: xcrun simctl pbcopy/pbpasteでiOSシミュレータのクリップボードを操作する

基本的な使い方

pbsync [-pv] <source device or "host"> <destination device or "host">の形式で実行する。 pbcopy/pbpasteは1台のデバイスに対して読み書きするのに対し、pbsyncは2つのペーストボード間でコピーする。

$ echo "device-a-text" | xcrun simctl pbcopy "TIL Pbsync A"
$ xcrun simctl pbsync "TIL Pbsync A" "TIL Pbsync B"
$ xcrun simctl pbpaste "TIL Pbsync B"
device-a-text

hostを指定するとmacOS本体のクリップボードとも同期できる

<source><destination>には、デバイスの代わりにhostという特別な値を指定できる。 hostはmacOS本体のクリップボードを指す。

$ echo "from-macos-host" | pbcopy
$ xcrun simctl pbsync host "TIL Pbsync A"
$ xcrun simctl pbpaste "TIL Pbsync A"
from-macos-host

デバイス側からmacOS本体へも同期できる。

$ echo "from-device-b" | xcrun simctl pbcopy "TIL Pbsync B"
$ xcrun simctl pbsync "TIL Pbsync B" host
$ pbpaste
from-device-b

同期は1回限りのスナップショットであり、以後の変更は自動追随しない

pbsyncはコマンド実行時点の内容をコピーするだけであり、その後同期元のペーストボードが変わっても、同期先には反映されない。

$ xcrun simctl pbsync "TIL Pbsync A" "TIL Pbsync B"
$ echo "second-copy-on-a" | xcrun simctl pbcopy "TIL Pbsync A"
$ xcrun simctl pbpaste "TIL Pbsync B"
device-a-text

継続的に同期したい場合は、変更のたびにpbsyncを実行し直す必要がある。

同じデバイスを同期元・同期先に指定するとエラーになる

$ xcrun simctl pbsync "TIL Pbsync A" "TIL Pbsync A"
Source and destination device must not be the same.
Sync the pasteboard content from one pasteboard to another.
Usage: simctl pbsync [-pv] <source device or "host"> <destination device or "host">
...

-vで同期内容の詳細を確認できる

-vを付けると、同期したデータの種類やバイト数が標準出力に表示される。 テキストの場合、public.utf8-plain-textpublic.plain-textpublic.textの3種類のフレーバー(データ形式)それぞれについてResolved item行が出力される。

$ xcrun simctl pbsync -v "TIL Pbsync A" "TIL Pbsync B"
Resolved item 1 flavor public.utf8-plain-text to 16 bytes of data.
Resolved item 1 flavor public.plain-text to 16 bytes of data.
Resolved item 1 flavor public.text to 16 bytes of data.
Sync complete.

対象デバイスは起動中(Booted)である必要がある

シャットダウン状態のデバイスを同期先に指定すると、明確なエラーになる。

$ xcrun simctl shutdown "TIL Pbsync B"
$ xcrun simctl pbsync "TIL Pbsync A" "TIL Pbsync B"
An error was encountered processing the command (domain=com.apple.CoreSimulator.SimError, code=405):
Device must be booted to access its pasteboard.

起動処理が完了しきっていない状態(bootstatusFinishedになる前)では、pbsyncpbcopyOperation timed out(domain=NSPOSIXErrorDomain, code=60)というタイムアウトエラーになる。 boot直後にペーストボードを操作する場合は、bootstatusで起動完了を待ってから実行する方が安全である。