При чтении из stdin
существует нормальный ASCII, может быть, какой-то utf-8, но есть и escape-последовательности.например, когда кто-то нажал клавишу «Стрелка вверх» на клавиатуре.
Как я реагирую на букву «А», но только когда она не является частью escape-последовательности, такой как «Esc [AD;»?Сначала удалив все escape-последовательности!Как мне это сделать?
Может быть, есть правило о том, как долго выполняются escape-последовательности?Может быть, какой-нибудь вывод / файл terminfo имеет все известные escape-последовательности?Никогда не находил ни одного из них?
Один из многих примеров, которые не работают:
#/bin/sh
while :; do
#this part is an made up example, case i do more complex stuff with $key
if test x"$key" = xA; then echo 'The Key A was pressed.'; fi
#end of made up example
key="$(/bin/bash -c 'read -s -n1 -t10 key; echo "$key"')"
if [[ "$key" == "q" ]]; then exit; fi
if [[ "$key" == "1" ]]; then sort="fin"; fi
if [[ "$key" == "2" ]]; then sort="size"; fi
if [[ "$key" == "3" ]]; then sort="percent"; fi
done;
Это работает как заклинание, но:
Если я нажму любую клавишу, котораявызывает escape-последовательность:
Arrow Up
- это некоторая последовательность, включающая 'A', поэтому она печатает 'A eas нажимается'
Я всегда использую скрипт илипрограмма, поэтому я могу реализовать правила, основанные на предыдущих байтах, но я не могу просто использовать какую-то "команду по конвейеру".
Если вы нашли этот вопрос, но просто ищете то же самое во время записи в файл или в любом другом случае, когда вы читаете более одного символа за раз, тогда возьмитепосмотрите на этот ответ
Как удалить escape-последовательности из входных данных, чтобы обычные символы внутри escape-последовательности можно было игнорировать?