Как сравнить 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

но это не работает (Я пробовал любые возможные варианты строки, которые приходили мне в голову, с или без escape-последовательностей и т. Д., Но безрезультатно.)

Что мне нужно сделать, чтобы сравнить вывод 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' ]
Другие вопросы по тегам