Operating System Command (OSC) はエスケープシーケンスの一種です。CLI アプリから Operating System(この場合はターミナルアプリのこと)に対して命令を送信する際に利用します。OSC には標準化団体などが存在せず、各ターミナルアプリで自由に実装が進められています。
ESC ] Ps ; Pt ST
ESC ] が OSC 開始を指すエスケープシーケンス、Ps が ID、Pt が引数、ST(ESC \ もしくは BEL)が終端です。
本記事では Windows Terminal で実装されている OSC を中心に、一部蘊蓄を交えながらご紹介するものです。なお、サンプルとして提示する PowerShell スクリプトは全て 7.x を前提としており、 ESC(エスケープ文字)として `e を、BEL(アラート文字)として `a を使用します。
| 概要 | 実装バージョン | 実装PR | |
|---|---|---|---|
| OSC 0 | タブ名を変更する | Initial Release | - |
| OSC 1 | タブ名を変更する | Initial Release | - |
| OSC 2 | タブ名を変更する | Initial Release | - |
| OSC 4 | カラーパレットを変更する | Initial Release | - |
| OSC 7 | 現在の作業ディレクトリを通知する | - | #20019 |
| OSC 8 | ハイパーリンクを表示する | v1.4.2652.0 | #7251 |
| OSC 9 | ConEmu 拡張 | ||
| OSC 9;4 | 進捗状況を表示する | v1.6.10272.0 | #8055 |
| OSC 9;9 | 現在の作業ディレクトリを通知する | v1.6.10272.0 | #8330 |
| OSC 9;12 | コマンド開始位置マーカー | v1.18.1421.0 | #14807 |
| OSC 10 | 文字色を変更する | v0.2 | #891 |
| OSC 11 | 背景色を変更する | v0.2 | #891 |
| OSC 12 | カーソル色を変更する | Initial Release | - |
| OSC 17 | ハイライト色を変更する | v1.22.2362.0 | #17742 |
| OSC 21 | タブ名を変更する | v1.21.1272.0 | #16804 |
| OSC 52 | クリップボード | v1.2.2022.0 | #5823 |
| OSC 104 | カラーパレットをリセットする | v1.23.11132.0 | #18767 |
| OSC 110 | 文字色をリセットする | v1.23.11132.0 | #18767 |
| OSC 111 | 背景色をリセットする | v1.23.11132.0 | #18767 |
| OSC 112 | カーソル色をリセットする | v1.23.11132.0 | #18767 |
| OSC 117 | ハイライト色をリセットする | v1.23.11132.0 | #18767 |
| OSC 133 | セマンティックインフォメーション(Final Term 拡張) | ||
| OSC 133;A | プロンプト開始位置マーカー | v1.15.186 | #13163 |
| OSC 133;B | コマンド開始位置マーカー | v1.17.1023 | #14341 |
| OSC 133;C | 出力開始位置マーカー | v1.17.1023 | #14341 |
| OSC 133;D | 出力終了位置マーカー | v1.17.1023 | #14341 |
| OSC 633 | VSCode 拡張 | ||
| OSC 633;Completions | シェル補完 | v1.19.2682.0 | #14938 |
| OSC 777 | urxvt 拡張 | ||
| OSC 777;notify | デスクトップ通知を送信する | - | #20012 |
| OSC 1337 | iTerm2 拡張 | - | - |
| OSC 1337;SetMark | スクロールバーにマークを追加する | v1.15.186 | #12948 |
| OSC 9001 | コマンドが見つからないことを通知する(Windows Terminal 拡張) | v1.22.2362.0 | #16848 |
OSC 0-2 : タブ名を変更する(SetIconAndWindowTitle/SetWindowIcon/SetWindowTitle)
元来はウィンドウタイトル(およびアイコン)を変更する OSC ですが、Windows Terminal ではタブ名の変更に相当します。
# タブ名を「タブ名」に変更
Write-Host -NoNewline "`e]0;タブ名`a"
# or
Write-Host -NoNewline "`e]1;タブ名`a"
# or
Write-Host -NoNewline "`e]2;タブ名`a"
OSC 21 : タブ名を変更する(DECSWT_SetWindowTitle)
こちらもタブ名の変更に相当します。DEC VT520 の DECSWT がこの仕様だったことに由来します。
# タブ名を「タブ名」に変更
Write-Host -NoNewline "`e]21;タブ名`a"
OSC 4 : カラーパレットを変更する(SetColor)
カラーパレットを変更します。色は X11 RGB Device String 形式や X11 の色名称 で指定します。
# カラーパレット 1 番の色を ff/ff/00 に変更
Write-Host -NoNewline "`e]4;1;rgb:ff/ff/00`a"
# or
Write-Host -NoNewline "`e]4;1;Yellow`a"
# 1 番の色で出力(CSI 38)
Write-Host "`e[38;5;1mこれは何色に見える?`e[0m"
OSC 104 : カラーパレットをリセットする(ResetColor)
カラーパレットの変更をリセットします。
# カラーパレット 1 番の変更をリセット
Write-Host -NoNewline "`e]104;1`a"
# 全カラーパレットの変更をリセット
Write-Host -NoNewline "`e]104`a"
OSC 7 : 現在の作業ディレクトリを通知する(CurrentWorkingDirectory)
現在の作業ディレクトリ(CWD)をターミナルに伝えます。
Write-Host -NoNewline "`e]7;file:///C:/Path`a"
PowerShell プロファイル の prompt 関数で OSC 7 を使用すると、「タブを複製する」機能で現在の作業ディレクトリを引き継げます。
function prompt {
$cwd = $($executionContext.SessionState.Path.CurrentLocation);
$uri = [System.Uri]::new($cwd).AbsoluteUri;
# OSC 7 で CWD を通知
$out += "`e]7;$uri`a";
# プロンプトを設定(デフォルトと同値)
$out += "PS $cwd$('>' * ($nestedPromptLevel + 1)) ";
return $out
}
Preview v1.25.923.0 に含まれていましたが、予期せぬネットワークアクセスを発生させたということで v1.25.1171.0 でリバートされた状態です。
OSC 8 : ハイパーリンクを表示する(HyperLink)
ハイパーリンクを表示します。
# [リンクテキスト](https://example.com)
Write-Host -NoNewline "`e]8;;https://example.com`aリンクテキスト`e]8;;`a"
OSC 9(ConEmuAction)
ConEmu に由来する OSC が 3 種実装されています。
OSC 9;4 : 進捗状況を表示する
タブアイコンにプログレスリングを、タスクバーにプログレスバーを表示します。
# 40 %
Write-Host -NoNewline "`e]9;4;1;40`a"
# 60 % (警告)
Write-Host -NoNewline "`e]9;4;4;60`a"
# 80 % (エラー)
Write-Host -NoNewline "`e]9;4;2;80`a"
# リセット
Write-Host -NoNewline "`e]9;4;0`a"
Microsoft Learn の Windows ターミナルで進行状況バーを設定する でも解説されています。
OSC 9;9 : 現在の作業ディレクトリを通知する
現在の作業ディレクトリ(CWD)をターミナルに伝えます。
Write-Host -NoNewline "`e]9;9;`"C:\Path`"`a"
PowerShell プロファイル の prompt 関数で OSC 9;9 を使用すると、「タブを複製する」機能で現在の作業ディレクトリを引き継げます。
function prompt {
$cwd = $($executionContext.SessionState.Path.CurrentLocation);
# OSC 9;9 で CWD を通知
$out += "`e]9;9;`"$cwd`"`a";
# プロンプトを設定(デフォルトと同値)
$out += "PS $cwd$('>' * ($nestedPromptLevel + 1)) ";
return $out
}
OSC 9;12 : コマンド開始位置マーカー
ターミナルにコマンドの開始位置を知らせます。OSC 133;B と同じです。
Write-Host -NoNewline "`e]9;12`a"
PowerShell プロファイル の prompt 関数で OSC 133;A (プロンプト開始位置マーカー)と組み合わせることで、ターミナルにプロンプトとコマンドの区切りを伝えられます。
function prompt {
# プロンプト開始位置マーカー
$out += "`e]133;A`a";
# デフォルトプロンプトと同値を設定
$out += "PS $($ExecutionContext.SessionState.Path.CurrentLocation)$('>' * ($NestedPromptLevel + 1)) ";
# コマンド開始位置マーカー
$out += "`e]9;12`a";
return $out
}
これにより、selectCommand アクションでコマンド範囲を選択できるようになります。
{
"actions": [
{
"command": {
"action": "selectCommand",
"direction": "prev"
},
"id": "User.selectCommand.prev"
},
{
"command": {
"action": "selectCommand",
"direction": "next"
},
"id": "User.selectCommand.next"
},
],
"keybindings": [
{
"id": "User.selectCommand.prev",
"keys": "ctrl+shift+left"
},
{
"id": "User.selectCommand.next",
"keys": "ctrl+shift+right"
},
]
}
OSC 10 : 文字色を変更する(SetForegroundColor)
文字色(フォアグラウンドカラー)を変更します。色は X11 RGB Device String 形式や X11 の色名称 で指定します。
# 文字色をシアンに設定
Write-Host -NoNewline "`e]10;rgb:00/ff/ff`a"
# or
Write-Host -NoNewline "`e]10;Cyan`a"
OSC 110 : 文字色をリセットする(ResetForegroundColor)
文字色(フォアグラウンドカラー)の変更をリセットします。
# 文字色の変更をリセット
Write-Host -NoNewline "`e]110`a"
OSC 11 : 背景色を変更する(SetBackgroundColor)
背景色(バックグラウンドカラー)を変更します。色は X11 RGB Device String 形式や X11 の色名称 で指定します。
# 背景色をマゼンタに設定
Write-Host -NoNewline "`e]11;rgb:ff/00/ff`a"
# or
Write-Host -NoNewline "`e]11;Magenta`a"
OSC 111 : 背景色をリセットする(ResetBackgroundColor)
背景色(バックグラウンドカラー)の変更をリセットします。
# 背景色の変更をリセット
Write-Host -NoNewline "`e]111`a"
OSC 12 : カーソル色を変更する(SetCursorColor)
カーソル色を変更します。色は X11 RGB Device String 形式や X11 の色名称 で指定します。
# カーソル色をライムに設定
Write-Host -NoNewline "`e]12;rgb:00/ff/00`a"
# or
Write-Host -NoNewline "`e]12;Lime`a"
OSC 112 : カーソル色をリセットする(ResetCursorColor)
カーソル色の変更をリセットします。
# カーソル色の変更をリセット
Write-Host -NoNewline "`e]112`a"
OSC 17 : ハイライト色を変更する(SetHighlightColor)
ハイライト色(選択された箇所の色)を変更します。色は X11 RGB Device String 形式や X11 の色名称 で指定します。
# ハイライト色を赤に設定
Write-Host -NoNewline "`e]17;rgb:ff/00/00`a"
# or
Write-Host -NoNewline "`e]17;Red`a"
OSC 117 : ハイライト色をリセットする(ResetHighlightColor)
ハイライト色の変更をリセットします。
# ハイライト色の変更をリセット
Write-Host -NoNewline "`e]117`a"
OSC 52 : クリップボード(SetClipboard)
クリップボードにテキストをコピーします。テキストは Base64 エンコードされている必要があります。
$Text = 'クリップボードにコピーしたいテキスト'
$EncodedText = [Convert]::ToBase64String([System.Text.Encoding]::UTF8.GetBytes($Text))
# クリップボードにテキストをコピーする
Write-Host -NoNewline "`e]52;c;$EncodedText`a"
Windows Terminal ではセキュリティ上の理由からクリップボードの読み取りを許可していませんが、VSCode の統合ターミナルには実装されていたりします。
# クリップボードからテキストを読み取る(Windows Terminal 未実装)
$ClipboardData = "`e]52;c;?`a".Split(";")
OSC 133 : セマンティックインフォメーション(Final Term拡張)
Final Term に由来する OSC が 4 種実装されています。Final Term は Finally terminated ですが、CUI をマークアップする精神は iTerm2 に引き継がれ、Windows Terminal にも取り込まれました。
[FTCS_PROMPT] PS C:\> [FTCS_COMMAND_START] Write-Host "Hello Bob!"
[FTCS_COMMAND_EXECUTED] Hello Bob! [FTCS_COMMAND_FINISHED]
[FTCS_PROMPT] PS C:\> [FTCS_COMMAND_START] Write-Host "Hello Alice!"
[FTCS_COMMAND_EXECUTED] Hello Alice! [FTCS_COMMAND_FINISHED]
リポジトリに関連機能の仕様書があるほか、Microsoft Learn の Windows ターミナルのシェル統合 でも解説されています。
OSC 133;A : プロンプト開始位置マーカー(FTCS_PROMPT)
ターミナルにプロンプトの開始位置を知らせます。
# プロンプト開始位置マーカー
Write-Host -NoNewline "`e]133;A`a"
PowerShell プロファイル の prompt 関数で使用することで、ターミナルにプロンプトの開始位置を伝えられます。
function prompt {
# プロンプト開始位置マーカー
$out += "`e]133;A`a";
# デフォルトプロンプトと同値を設定
$out += "PS $($ExecutionContext.SessionState.Path.CurrentLocation)$('>' * ($NestedPromptLevel + 1)) ";
return $out
}
これにより、selectOutput アクションで出力範囲を選択できるようになります。
{
"actions": [
{
"command": {
"action": "selectOutput",
"direction": "prev"
},
"id": "User.selectOutput.prev"
},
{
"command": {
"action": "selectOutput",
"direction": "next"
},
"id": "User.selectOutput.next"
},
],
"keybindings": [
{
"id": "User.selectOutput.prev",
"keys": "ctrl+shift+up"
},
{
"id": "User.selectOutput.next",
"keys": "ctrl+shift+down"
},
]
}
OSC 133;B : コマンド開始位置マーカー(FTCS_COMMAND_START)
ターミナルにコマンドの開始位置を知らせます。
# コマンド開始位置マーカー
Write-Host -NoNewline "`e]133;B`a"
PowerShell プロファイル の prompt 関数で OSC 133;A (プロンプト開始位置マーカー)と組み合わせることで、ターミナルにプロンプトとコマンドの区切りを伝えられます。
function prompt {
# プロンプト開始位置マーカー
$out += "`e]133;A`a";
# デフォルトプロンプトと同値を設定
$out += "PS $($ExecutionContext.SessionState.Path.CurrentLocation)$('>' * ($NestedPromptLevel + 1)) ";
# コマンド開始位置マーカー
$out += "`e]133;B`a";
return $out
}
これにより、selectCommand アクションでコマンド範囲を選択できるようになります。
{
"actions": [
{
"command": {
"action": "selectCommand",
"direction": "prev"
},
"id": "User.selectCommand.prev"
},
{
"command": {
"action": "selectCommand",
"direction": "next"
},
"id": "User.selectCommand.next"
},
],
"keybindings": [
{
"id": "User.selectCommand.prev",
"keys": "ctrl+shift+left"
},
{
"id": "User.selectCommand.next",
"keys": "ctrl+shift+right"
},
]
}
OSC 133;C : 出力開始位置マーカー(FTCS_COMMAND_EXECUTED)
ターミナルに出力の開始位置を知らせます。
# 出力開始位置マーカー
Write-Host -NoNewline "`e]133;C`a"
OSC 133;D : 出力終了位置マーカー(FTCS_COMMAND_FINISHED)
ターミナルに出力の終了位置と終了コードを知らせます。
# 出力終了位置マーカー
Write-Host -NoNewline "`e]133;D`a"
PowerShell プロファイル の prompt 関数で使用することで、ターミナルに出力の終了位置と終了コードを伝えられます。
# 前回プロンプト表示時の履歴 ID を保持するグローバル変数
$Global:__LastHistoryId = -1;
function prompt {
# 最後のコマンドが成功した場合は True
$isLastCommandSuccess = $?;
# 現時点で最新の履歴 ID
$lastHistoryEntry = Get-History -Count 1;
# 最初のコマンドが実行されていない場合はスキップ
if ($Global:__LastHistoryId -ne -1) {
# 前回プロンプト表示時から履歴 ID が変わっていない(例: Ctrl+C)なら、終了コードなしで出力終了位置マーカーを出力する
if ($lastHistoryEntry.Id -eq $Global:__LastHistoryId) {
$out += "`e]133;D`a";
}
else {
# 前回分の終了コードを取得
if ($isLastCommandSuccess) { $Ps = 0 }
elseif ($Error[0].InvocationInfo.HistoryId -eq $lastHistoryEntry.Id) { $Ps = -1 }
else { $Ps = $LASTEXITCODE }
# 出力終了位置マーカーを出力
$out += "`e]133;D;$Ps`a"
}
}
# 履歴 ID を更新
$Global:__LastHistoryId = $lastHistoryEntry.Id
# デフォルトプロンプトと同値を設定
$out += "PS $($ExecutionContext.SessionState.Path.CurrentLocation)$('>' * ($NestedPromptLevel + 1)) ";
return $out
}
これにより、スクロールバーにマークを表示できます。マークの色は終了コードに応じて変化します。
{
"profiles": [
{
"defaults":
{
"showMarksOnScrollbar": true,
}
}
]
}
OSC 633 : VSCode 拡張(VsCodeAction)
VSCode が OSC 133 にインスパイアされて実装した OSC で、OSC 133 に ;E および ;P を追加したスーパーセットになっています。
OSC 633;Completions : シェル補完
OSC 633;Completions は VSCode の統合ターミナル上で PowerShell のオートコンプリートを実現するためのものでしたが、組込のシェル補完機能に移行して廃止されました。1 Windows Terminal では記事執筆時点においてまだ廃止されていませんが、あえて紙幅は費やしません。
OSC 777 : urxvt 拡張(UrxvtAction)
rxvt-unicode (urxvt) に由来する OSC です。urxvt は rxvt の Unicode 対応版ですが、Perl 拡張サポートも追加されています。Perl 拡張用に様々なフックが用意されていますが、そのうち on_osc_seq_perl フックは `e]777;<拡張機能名>;<パラメタ>`a を受信した際に呼び出されます。つまり、urxvt ではユーザが自由に OSC 777 を拡張できるということです。Windows Terminal ではこのうち 1 種が実装されています。
OSC 777;notify : デスクトップ通知を送信する
デスクトップ通知を送信します。
# 一時停止中に Windows Terminal からフォーカスを外すと通知が送信される
Start-Sleep 2; Write-Host -NoNewline "`e]777;notify;タイトル;本文`a"
源流は 2012 年に Yoran Brault 氏が公開した urxvt 用 Perl 拡張 です。これを phyks 氏が改良した後、Enlightenment Terminology のバグトラッカーに OSC 777;notify のサポートを求める Task を建てました。この Task を契機として Terminology に OSC 777;notify が実装されたのが 2015 年のことです。
同年、GNOME Bugzilla の Notifications for long-running commands という Issue で Terminology での実装が紹介されます。この Issue に投稿されたパッチは GNOME vte の Fedora 版フォークで取り込まれました。これはやがてダウンストリームの CentOS 7.4.1708 にも取り込まれメジャーどころとなります。
その後 foot では 2020 年に、 ghostty では 2023 年に実装され、#20012 で Windows Terminal にも実装されることになります。記事執筆時点では Nightly Build で下記設定を有効化した場合に利用可能となります。
{
"profiles":
{
"defaults": {
"compatibility.allowOSC777": true
},
}
}
OSC 1337 : iTerm2 拡張(ITerm2Action)
iTerm2 に由来する OSC が 1 種実装されています。
OSC 1337;SetMark : スクロールマークを追加する
現在の位置にスクロールマークをつけます。
# スクロールマーク
Write-Host -NoNewline "`e]1337;SetMark`a"
サンプルとしては前後に改行を出力した方がわかりやすいですね。
Write-Host "`n`n`n`t`t`t`t`t`t`t`t`t`t`t`t`t`tここ`e]1337;SetMark`a`n`n`n"
OSC 9001 : コマンドが見つからないことを通知する(WTAction)
最後は Windows Terminal 自身による拡張です。ターミナルは以下の OSC を受け取ると、左端に Quick Fix が表示されるということです。
OSC 9001; SuggestInput; <cmd>; <description>
伝聞調なのは、関連 PR は v1.22 でマージされ Developer Blog でも取り上げられているものの、手元の環境では表示されなかったためです。Spec に掲載されているスクリーンショットはモックのままとなっています。
まとめと余談 with さくらの AI Engine
Initial Release で実装されていたものから Nightly Build にしか含まれないものまで、Windows Terminal は OSC のサポートを継続的に追加してきました。$PSStyle 自動変数など OSC 以外の手段でも実現可能な機能も多いですが、古いコンソール技術は Sixel のように時代を超えて有用性が再浮上するケースもあります。現に、Claude Code のような CLI ベースのエージェントからデスクトップ通知を送る方法として OSC 777;notify が取り上げられていますし、これらを記憶に留めて損はありません。本記事では Windows Terminal に実装されたものを中心に取り上げましたが、vtdn や Terminfo.dev などを参照して残りの OSC を知るのも面白いでしょう。
クリックして余談を展開…
本記事は筆者が心を込めて人力で執筆したものですが、例によって投稿前に複数の AI モデルにレビューしてもらっています。今回は Qiita x さくらの AI Engine キャンペーンに因んで、Open AI 互換 API 経由で GitHub Copilot チャットから各モデルにレビューをお願いしました。今回は以下のモデルで同様のプロンプトを試しました。
| モデル名 | アクティブパラメータ数 | パラメータ合計 |
|---|---|---|
| gpt-oss-120b | 5.1b | 117b |
| preview/gemma-4-31B-it | 3.8B | 25.2B |
| preview/Kimi-K2.6 | 32B | 1T |
| preview/Qwen3.6-35B-A3B | 3B | 35B |
Gemma 4 と Kimi K2.6、Qwen 3.6 は 2026 年 4 月リリースのオープンモデル同士ですが、体感として Kimi K2.6 の指摘にもっとも高い知性を感じたのが印象的でした。ただし、この中だとアクティブパラメータ数が桁違いなだけあって、応答速度では他モデルより幾分遅かったです。計算機資源が十分にあればオープンモデルで実用的な賢さを感じられる現状と、巷で囁かれる「日本語ドキュメントには中華系 LLM が向いている説」を体感できるいい機会となりました。ありがとう、さくらの AI Engine 無償枠。
参考リンク
- 窓辺の小石(65) The OSC Project | マイナビニュース
- VT Sequence Reference - Terminal API (VT)
- OSC Sequences | vtdn▒
- Terminfo.dev — Can Your Terminal Do That? | Terminfo.dev
- コンソール仮想ターミナル シーケンス - Windows Console | Microsoft Learn
- about_Special_Characters - PowerShell | Microsoft Learn
- terminal/src/terminal/parser/OutputStateMachineEngine.cpp at main · microsoft/terminal
- terminal/src/terminal/adapter/adaptDispatch.cpp at main · microsoft/terminal
- Are there any settings to configure to use CMD Quick Fix? · Issue #20484 · microsoft/terminal






















