Wie vergleicht man eine Escape-Sequenz mit einer konstanten Zeichenfolge?

Wie vergleicht man eine Escape-Sequenz mit einer konstanten Zeichenfolge?

Ich wollte etwas tun, das von der Hintergrundfarbe meines Terminals abhängt. Ich fand heraus, dass dies durch Ausführen von

printf '\e]11;?\a'

In meinem Fall ist die Ausgabe

stanton@mybox:~$ printf '\e]11;?\a'
^[]11;rgb:ffff/ffff/ffff^Gstanton@mybox:~$ 11;rgb:ffff/ffff/ffff

was schon verwirrend ist. Jedenfalls dachte ich daran, einen Test wie diesen durchzuführen

[ "$(printf '\e]11;?\a')" = "^[]11;rgb:ffff/ffff/ffff^G" ] && echo it\'s light || echo it\'s dark

aber es funktioniert nicht. (Ich habe jede mögliche Variation der Zeichenfolge ausprobiert, die mir in den Sinn kam, mit oder ohne Escape-Sequenzen usw., ohne Ergebnis.)

Was muss ich tun, um die Ausgabe von printf und einem String zu vergleichen?

Antwort1

Das Problem besteht darin, dass Sie nicht die Ausgabe von möchten printf, sondern die Antwort vom Terminal. Ihre $(...)wird nicht als diese Antwort ausgewertet, wie wir sehen können:

$ v=$(printf '\e]11;?\a')
$ printf "%q\n" "$v"
$'\E]11;?\a'

Die Variable v ist dieselbe wie die Ausgabe des ersten printf (das $'...' ist das Ergebnis des Formats, %qdas die Zeichenfolge in Anführungszeichen setzt).

Sie müssen den Shell- readBefehl verwenden, um die Antwort vom Terminal abzufangen. Zum Beispiel mit Bash:

$ read  -n 24 -p "$v"  reply
$ printf "%q\n" "$reply"
$'\E]11;rgb:ffff/ffff/ffff\a'

Hier -pwird die Variable zum Drucken verwendet $vund die Variable replyliest 24 Zeichen aus der Terminalantwort. Das abschließende printf zeigt, dass replyes die erwartete Zeichenfolge enthält. Sie können also damit vergleichen:

[ "$reply" = $'\e]11;rgb:ffff/ffff/ffff\a' ]

verwandte Informationen