• home
  • about
  • 全ての投稿
  • ソフトウェア・ハードウェアの設定のまとめ
  • 分析関連のまとめ
  • ヘルスケア関連のまとめ
  • 生涯学習関連のまとめ

zsh osc52

date: 2025-11-01 excerpt: zsh osc52

tag: zshosc52


zsh osc52

概要

  • ターミナルエスケープシーケンスの国際規格
  • リモートマシン(SSH経由など)からローカルのクリップボードにテキストをコピーするための標準
  • ANSI/VT100互換のターミナルが対応

tmuxの設定

  • tmux.confに以下を追加
##! クリップボードのコピー
set -s set-clipboard on
set -g allow-passthrough on

スクリプト例

osc52copy.zsh

#!/usr/bin/env zsh
# OSC52を使用してクリップボードにコピーするスクリプト

# -e: コマンドがエラーで終了したら即座にスクリプトを終了
# -u: 未定義の変数を参照したらエラーとして扱う
set -eu

# 入力元の判定と取得
# -t 0: 標準入力がターミナル(パイプではない)かチェック
# $# -gt 0: コマンドライン引数が1個以上あるかチェック
# 両方の条件を満たす場合:引数の全文字列を使用
# それ以外の場合:標準入力(パイプやリダイレクト)から読み込み
if [[ -t 0 && $# -gt 0 ]]; then 
    buf="${*}"      # 全引数を結合して変数に格納
else 
    buf="$(cat)"    # 標準入力から全テキストを読み込み
fi

# Base64エンコード処理
# printf %s: 改行を追加せずに文字列を出力
# base64: テキストをBase64形式にエンコード
# tr -d '\n': Base64出力から改行文字を削除(OSC52は改行なしのBase64が必要)
b64=$(printf %s "$buf" | base64 | tr -d '\n')

# OSC52エスケープシーケンスを出力
# \e]52;c;: OSC52シーケンスの開始(cはクリップボード指定)
# %s: Base64エンコードされたテキストを挿入
# \a: ベル文字(シーケンスの終端)
# ターミナルがこのシーケンスを解釈してクリップボードに転送
printf '\e]52;c;%s\a\n' "$b64"

使用例

# コマンドライン引数からコピー
$ osc52copy.zsh "コピーしたいテキスト"

# パイプ経由でコピー
$ echo "hello world" | osc52copy.zsh

# ファイルの内容をコピー
$ cat file.txt | osc52copy.zsh


zshosc52 Share Tweet