Prompt

提示字元串中的響鈴和轉義字元

  • June 17, 2016

我的提示字元串是使用此語句列印的,

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**和 ASCII BEL) 結束。

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 SequencesC1 (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**),最終解決了這個問題。

引用自:https://unix.stackexchange.com/questions/208436