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-text・public.plain-text・public.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.
起動処理が完了しきっていない状態(bootstatusがFinishedになる前)では、pbsync・pbcopyはOperation timed out(domain=NSPOSIXErrorDomain, code=60)というタイムアウトエラーになる。
boot直後にペーストボードを操作する場合は、bootstatusで起動完了を待ってから実行する方が安全である。
