提示字符串中的响铃和转义字符

提示字符串中的响铃和转义字符

我的提示字符串是使用此语句打印的,

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

这更容易理解。

那么,如何转义字符\033007转换为 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'

相关内容