Erkennen Sie programmgesteuert den vom Terminal unterstützten ANSI-Escape-Code

Erkennen Sie programmgesteuert den vom Terminal unterstützten ANSI-Escape-Code

Ich spiele mit Shell-Skripten herum, die ANSI-Codes verwenden, und habe festgestellt, dass aus dem einen oder anderen Grund je nach Terminal/Betriebssystem unterschiedliche Escape-Codes unterstützt werden.

In manchen Fällen erhalte ich unerwartet einen Dump mit nicht analysiertem Müll, was meiner Ansicht nach bedeutet, dass mein Terminal (unter Mac OS) den verwendeten Escape-Code nicht unterstützt, obwohl ich an mehreren Stellen gelesen habe, dass dies dasselbe bedeutet:

27 = 033 = 0x1b = ^[ = \e

Beim Suchen fand ichdiese Frage zum Erkennen von Slash-Escaped-Unterstützung.

Die ausgewählte Antwort schnüffelt den $TERMzu erkennenden Wert

case $TERM in
  (|color(|?))(([Ekx]|dt|(ai|n)x)term|rxvt|screen*)*)
    PS1=$'\e\]0;$GENERATED_WINDOW_TITLE\a'"$PS1"
esac

Aber ich frage mich, wie zuverlässig das ist.

Gibt es eine Standardmethode zum Überprüfen der Escape-Code-Unterstützung (hauptsächlich für Bash) oder ist dieses Skript so ziemlich das Allerweltsskript?

  • Alternativ: Welchen Escape-Code kann ich verwenden, um die umfassendste Unterstützung zu „garantieren“?
  • Was ist mit der Echo-Erweiterung -e?
  • Was sind allgemeine Best Practices in Bezug auf Portabilität/Verfügbarkeit/Verteilung fürSkriptedie Steuercodes verwenden oder darauf verweisen?

Das istauch eine nette Lektürefür alle anderen, die nach Informationen suchen.

Antwort1

Haben Sie konkrete Einsätze im Sinn?

Hier ist ein Beispiel für die Verwendungherausragender Modus, was auf vielen Terminals ein deutlich sichtbares Ergebnis liefert:

tput smso; echo hello, world; tput rmso

Das tputTool verwendet den Wert der $TERMUmgebungsvariable, um zu bestimmen, welche Escape-Sequenzen ausgegeben werden sollen (falls überhaupt welche). Zum Beispiel

TERM=xterm
( tput smso; echo hello, world; tput rmso ) | hexdump -C
00000000  1b 5b 37 6d 68 65 6c 6c  6f 2c 20 77 6f 72 6c 64  |.[7mhello, world|
00000010  0a 1b 5b 32 37 6d                                 |..[27m|

TERM=dumb
( tput smso; echo hello, world; tput rmso ) | hexdump -C
00000000  68 65 6c 6c 6f 2c 20 77  6f 72 6c 64 0a           |hello, world.|

Interessante Merkmalspaare finden sich inman 5 terminfo, einige davon sind wie folgt:

  • Herausragend: smsoundrmso
  • Unterstreichen: smulundrmul
  • Blinzeln (ja!):blink
  • Doppelbreit: swidmundrwidm
  • Umkehren:rev
  • Alle Absagen:sgr0

Wenn Sie fetten Text schreiben möchten, aber nur, wenn das Terminal ihn versteht, dann funktioniert ein Snippet wie dieses

boldOn=$(tput smso)
boldOff=$(tput rmso)
# ...
printf "%s%s%s\n" "$boldOn" 'This message will be in bold, when available' "$boldOff"

Antwort2

Tatsächlich ist es möglich, DEC-Terminals (und ihre Klone und Emulationen, einschließlich xterm) nach ihren Fähigkeiten zu fragen; allerdings nicht nach der Unterstützung einzelner Escape-Sequenzen (oder deren Vollständigkeit). UNIX verwendet diese Funktion im Allgemeinen nicht und verlässt sich auf termcap/terminfo-Datenbanken (die die Eigenheiten ebenfalls dokumentieren).

Als Referenz lauten die Sequenzen DA („Device Attributes“, ANSI-Standard) und DECID („Identify Terminal“, DEC privat).

verwandte Informationen