我正在解决一些 CTF 问题并遇到了这个命令,
echo $'\e(0'
这个命令有什么用呢?
答案1
tl;dr:它将终端切换到框绘制模式,使小写文本看起来像┌─┘。
在 bash 中,$' ... '
是一种解释 C 风格转义字符(例如\e
、\n
、\t
)的引用模式。因此,引用的字符串$'\e(0'
会产生三个字节,0x1B 0x28 0x30(ESC、“(”、“0”)。
以 0x1B/ESC 开头的序列在写入(回显)到终端时具有特殊含义(例如,\e[A
向上移动光标、\e[…m
设置文本格式),类似地,特殊键被读为以 ESC 开头的序列。
可以找到各种终端识别的转义序列的大量(但仍然不完全完整)列表在 Xterm 的网站上根据此列表,\e(…
即ESC ( …
选择字符集用于 G0 插槽,即用于常规文本。
在 Unicode/UTF-8(以及其他多字节字符集和编码)出现之前,大多数计算机和终端直接将每个字节值映射到一个字符,为了显示超过 256 个不同的字符,VT100 兼容终端会识别转义序列来切换映射字节→字符。
根据 Xterm 表,ESC ( 0
告诉终端使用字符集 0,即“DEC 特殊字符和线条绘制集”,通常称为备用字符集。它包括这样的字符,◆ ▒ ␉ ␌ ␍ ␊ ° ±  ␋ ┘ ┐ ┌ └ ┼ ⎺⎻─⎼⎽ ├ ┤ ┴ ┬ │ ≤ ≥ π ≠ £
并且仍然常用于在终端不理解 Unicode 时绘制框和对话框窗口。
例如,echo $'\e(0jklmn\e(B'
将切换到 ACS,打印┘┐┌└┼
,然后切换回来。