Как сравнить escape-последовательность с константной строкой?

Как сравнить escape-последовательность с константной строкой?

Я хотел сделать что-то условно на основе цвета фона моего терминала, что, как я обнаружил, можно сделать, запустив

printf '\e]11;?\a'

В моем случае вывод такой:

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

что уже сбивает с толку. В любом случае, я подумал о запуске теста типа

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

но это не работает. (Я перепробовал все возможные варианты строки, которые пришли мне в голову, с управляющими последовательностями и т. д. или без них, но безрезультатно.)

Что мне нужно сделать, чтобы сравнить вывод printf и строку?

решение1

Проблема в том, что вам нужен не вывод printf, а ответ с терминала. Ваш $(...)не оценивается в этот ответ, как мы видим:

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

Переменная v совпадает с выводом первой функции printf ($'...' — это результат формата, %qкоторый заключает строку в кавычки).

Вам нужно использовать команду оболочки read, чтобы захватить ответ с терминала. Например, с bash:

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

Здесь -pиспользуется для печати переменной $v, а переменная replyсчитывает 24 символа из ответа терминала. Окончательный printf показывает, что replyсодержит ожидаемую вами строку. Так что вы можете сравнить с ней:

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

Связанный контент