我的提示字符串是使用此语句打印的,
printf '\033]0;%s@%s:%s\007' user host /home/user
为什么需要转义符(\033
)和响铃符(007
)?当我手动运行相同的命令时,它什么也不打印。
当我删除转义字符并给出命令时,
printf '%s@%s:%s' user host /home/user
它打印,
user@home:/home/user
这更容易理解。
那么,如何转义字符\033
并007
转换为 shell 提示符字符串呢?
答案1
事实上,转义序列开始于第一的转义字符\033
和结束与\007
(ASCIIESC
和 ASCIIBEL
)。
是0
一个参数,对应于PS在 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.
两者\033]
和\007
都是部分转义序列可以更改为其他人物。终端将这对字节视为单个控制字符(就像将 4 个字节\007
视为printf
单个字符一样)。参考XTerm 控制序列, 这部分C1(8 位)控制字符可能有帮助:
ESC \
String Terminator (ST is 0x9c).
ESC ]
Operating System Command (OSC is 0x9d).
在理解的开始操作系统控制:
OSC Ps ; Pt ST
OSC Ps ; Pt BEL
使用BEL
( \007
) 结束转义序列是一种异常情况。它不符合标准(ECMA-48)。操作系统控件应以 或ESC ]
0x9d 开头,以ESC \
或 0x9c 结尾。
很久以前,xterm 的开发者添加了一个转义序列来设置标题。在 X11R1 (1987) 中,程序只是读取序列,直到获得非打印字符。后来,在 X11R4 (1989) 中,有人通过终止一个BEL
特点。该标准的存在时间比这要长,但选择的原因BEL
而不是ST
尚不清楚。最终这个问题在 20 世纪 90 年代末得到了解决,通过认识到其中之一(但保持BEL
作为替代方案,因为许多用户依赖于硬编码行为BEL
)。
答案2
仅\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.
您看不到任何更改可能是因为您的提示在返回提示时将标题设置为默认标题字符串。尝试:
PROMPT_COMMAND= ; printf '\033]0;Hello World!\007'