![Bash-Eingabeaufforderung mit Steuerzeichen mit der Breite Null](https://rvso.com/image/1703362/Bash-Eingabeaufforderung%20mit%20Steuerzeichen%20mit%20der%20Breite%20Null.png)
Um zu verhindern, dass sich die Eingabeaufforderung um von rechts nach links verlaufenden Text verzieht, möchte ich ein LRM mit der Breite Null in die Bash-Eingabeaufforderung einfügen (U200e). Da es sich um ein Zeichen mit der Breite Null handelt, war mein Instinkt, es mit zu umschließen \[<200e>\]
. Es stellte sich heraus, dass dies tatsächlich dazu führt, dass Bash den Zeilenumbruch an der falschen Stelle durchführt. Wenn ich es nicht mit irgendetwas umschließe,Dannes scheint gut zu funktionieren.
Was ich nicht verstehe. Selbst wenn Bash automatisch erkennt, dass dieses Zeichen eine Breite von Null hat, \[...\]
hätte es nicht schaden dürfen, es mit einem zu umschließen.
BEARBEITET: Die Frage ist also: Wann ist \[...\]
das Escapen tatsächlich erforderlich und wie kann es möglicherweise schädlich sein, wenn die Escape-Zeichen tatsächlich die Breite Null haben.
Antwort1
Zum Beitrag Escapen von Zeichen der Länge Null in Bash. und insbesondere die Antwort von Michael Allen die ich im Folgenden wiedergebe:
Die
\[
Sequenzen werden von einigen Dienstprogrammen, einschließlich PS1, verwendet, um die\001
Steuercodes\002
darzustellen:
\[
=>\x01
oder\001
\]
=>\x02
oder\002
\[
printf und echo führen diese Übersetzung von nach nicht durch\001
.Die Lösung bestand also darin, die Konvertierung selbst vorzunehmen. Anstatt Zeichen der Länge Null in Folgendes einzuschließen
\[
:echo "\[\033[1;30m\]foo\[\033[0m\]"
was ausgeben würde
\[foo\]
Stattdessen gebe ich den eigentlichen Steuercode aus:
echo "\x01\033[1;30m\x02foo\x01\033[0m\x02"
foo
welches sowohl auf PS1 printf als auch echo ausgibt .Ein konkretes Beispiel finden Sie unterdieses Commit auf Git-Radar.