我的提示字符串是使用此语句打印的,
printf '\033]0;%s@%s:%s\007' user host /home/user
Run Code Online (Sandbox Code Playgroud)
为什么它需要一个转义字符 ( \033) 和一个响铃字符 ( 007)?当我手动运行相同的命令时,它什么也不打印。
当我删除转义字符并给出命令时,
printf '%s@%s:%s' user host /home/user
Run Code Online (Sandbox Code Playgroud)
它打印,
user@home:/home/user
Run Code Online (Sandbox Code Playgroud)
这更容易理解。
那么,转义字符\033和如何007转换为 shell 提示字符串呢?
实际上,转义序列以第一个转义字符开始,以\033\007(ASCIIESC和 ASCII BEL) 结束。
的0是一个参数,对应于诗在xterm中的描述,而分号之后的文本是铂:
Ps = 0 -> Change Icon Name and Window Title to Pt.
Ps = 1 -> Change Icon Name to Pt.
Ps = 2 -> Change Window Title to Pt.
Run Code Online (Sandbox Code Playgroud)
两个\033]和\033\007是部件,其可改变为转义序列的其他字符。终端将这对字节视为单个控制字符(就像将 4 个字节\007视为printf单个字符一样)。参考XTerm Control Sequences,C1 (8-Bit) Control Characters 部分可能会有所帮助:
ESC \
String Terminator (ST is 0x9c).
ESC ]
Operating System Command (OSC is 0x9d).
Run Code Online (Sandbox Code Playgroud)
在理解操作系统控制的开始:
OSC Ps ; Pt ST
OSC Ps ; Pt BEL
Run Code Online (Sandbox Code Playgroud)
使用BEL( \007) 结束转义序列是一种反常现象。它不遵循标准(ECMA-48)。操作系统控件应以ESC ]或 0x9d开头,以或 0x9c 结尾ESC \。
很久以前,xterm 的开发人员添加了一个用于设置标题的转义序列。在 X11R1 (1987) 中,程序简单地读取序列直到它得到一个非打印字符。后来,在 X11R4 (1989) 中,有人通过终止BEL字符来改进这一点。该标准的存在时间比这更长,但选择BEL而不是的原因ST尚不清楚。最终,在 1990 年代后期,通过识别其中任何一个(但保留BEL作为替代方案,因为许多用户依赖于使用 的硬编码行为BEL)解决了这个问题。
Only\033是一个转义,它启动转义序列直到并包括;. \033]0;. 这将启动一个设置终端标题栏中标题的字符串,该字符串以\007特殊字符结尾。
见man console_codes:
It accepts ESC ] (OSC) for the setting of certain resources. In addi?
tion to the ECMA-48 string terminator (ST), xterm(1) accepts a BEL to
terminate an OSC string. These are a few of the OSC control sequences
recognized by xterm(1):
ESC ] 0 ; txt ST Set icon name and window title to txt.
Run Code Online (Sandbox Code Playgroud)
您没有看到任何更改可能是因为您的提示在返回提示时将标题设置为默认标题字符串。尝试:
PROMPT_COMMAND= ; printf '\033]0;Hello World!\007'
Run Code Online (Sandbox Code Playgroud)