
私のプロンプト文字列は、次の文を使用して印刷されます。
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
プロンプト文字列に変換しますか?
答え1
実は、エスケープシーケンス次から始まった最初エスケープ文字\033
と終わる(\007
ASCIIESC
とASCIIBEL
)。
0
は次のパラメータです。PSxtermの説明では、セミコロンの後のテキストは次のとおりです。プラチナ:
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
まだ明確ではありません。結局のところ、問題は1990年代後半に次のいずれかを認識することによって解決されました。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'