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, %q
das die Zeichenfolge in Anführungszeichen setzt).
Sie müssen den Shell- read
Befehl 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 -p
wird die Variable zum Drucken verwendet $v
und die Variable reply
liest 24 Zeichen aus der Terminalantwort. Das abschließende printf zeigt, dass reply
es die erwartete Zeichenfolge enthält. Sie können also damit vergleichen:
[ "$reply" = $'\e]11;rgb:ffff/ffff/ffff\a' ]