提示字元串中的響鈴和轉義字元
我的提示字元串是使用此語句列印的,
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 提示字元串呢?
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.
您沒有看到任何更改可能是因為您的提示在返回提示時將標題設置為預設標題字元串。嘗試:
PROMPT_COMMAND= ; printf '\033]0;Hello World!\007'
實際上,轉義序列從第一個轉義字元開始,以
\033\007
(ASCII**ESC
**和 ASCIIBEL
) 結束。
0
是一個參數,對應於 xterm 描述中的Ps,而分號後面的文本是Pt: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]
和都是轉義序列\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).
了解作業系統控制的開始:
OSC Ps ; Pt ST OSC Ps ; Pt BEL
使用**
BEL
**(\007
) 結束轉義序列是異常的。它不遵循標準(ECMA-48)。作業系統控制項應以ESC ]
or 或 0x9d 開頭,並以ESC \
or 0x9c 結尾。很久以前,xterm 的開發者添加了一個轉義序列來設置標題。在 X11R1 (1987) 中,程序簡單地讀取序列,直到它得到一個非列印字元。後來,在 X11R4 (1989) 中,有人通過終止一個**
BEL
角色來改進這一點。BEL
該標準的存在時間比這更長,但選擇而不是選擇的原因ST
尚不清楚。最終,在 1990 年代後期,通過辨識其中任何一個(但BEL
由於許多使用者依賴於硬編碼的行為,因此將其保留為替代方案BEL
**),最終解決了這個問題。