跳到主要内容
ansicode

DSR — 设备状态报告(CSI 5n / CSI 6n)

查询终端状态(5n)或当前光标位置(6n)—— TUI 用以测量终端大小的反向通道。

字节形式

涵盖所有常见的字符串字面量写法,方便正反查找。

\\x1b[\x1b[5n (status request) \x1b[6n (cursor pos request)
\\033[\033[5n / \033[6n
\\e[\e[5n / \e[6n
ESC [ESC [ Ps n
hex1b 5b <Ps> 6e

说明

Device Status Report。程序发出请求,终端在 stdin 上回复。**`\x1b[5n`** —— 「你还好吗?」。回复:`\x1b[0n`(就绪)或 `\x1b[3n`(异常)。常作为启用奇特模式后的存活检查。**`\x1b[6n`**(又名 CPR,Cursor Position Report)—— 「光标在哪?」。回复:`\x1b[<row>;<col>R`。在没有 TIOCGWINSZ 的情况下测算终端大小的经典套路:把光标推到屏幕末端(`\x1b[9999;9999H`),DSR-6n,解析回复,再还原。现代程序首选 `ioctl(TIOCGWINSZ)` + `SIGWINCH` 监听 resize,但缺少该 ioctl 的场景(原始串口、某些 CI 环境)下,DSR-6n 仍是唯一可移植方案。xterm 扩展:`\x1b[?6n` 返回受 DECOM(origin mode)约束的光标位置。

规范出处: ECMA-48 §8.3.35 (DSR) / xterm-ctlseqs

示例

bash
# Discover terminal size without TIOCGWINSZ:\nstty -echo raw min 0 time 5\nprintf '\033[s\033[9999;9999H\033[6n\033[u'\nIFS=';' read -r -d R esc_row col; stty sane\necho "rows=${esc_row#*[} cols=$col"
python
import sys; sys.stdout.write('\x1b[6n')   # reply arrives on stdin in raw mode
go
fmt.Print("\x1b[6n")
javascript
process.stdout.write('\x1b[6n')
c
printf("\x1b[6n"); fflush(stdout); /* parse <row>;<col>R from stdin */

终端支持

xterm
支持
Linux console (fbcon)
支持
macOS Terminal.app
支持
iTerm2
支持
Windows Terminal
支持
cmd.exe / ConPTY
支持
kitty
支持
alacritty
支持
WezTerm
支持
Ghostty
支持
GNOME Terminal
支持
Konsole
支持
tmux
不支持
GNU screen
不支持

相关序列

在家族食谱中

CSI 食谱 · 4. 查询 —— DA、DA2、DSR、DECRQM