Распечатайте в настоящее время нажатые клавиши к stdout и считайте их линию за линией

Существует специальный синтаксис для этого:

for i do
  printf '%s\n' "$i"
done

В более общем плане список параметров текущего сценария или функции доступен через специальную переменную $@.

for i in "$@"; do
  printf '%s\n' "$i"
done

Обратите внимание необходимость в двойных кавычках вокруг $@, иначе параметры подвергаются подстановочному расширению и полевому разделению. "$@" является волшебным: несмотря на двойные кавычки, это расширяется в столько же полей, сколько существуют параметры.

print_arguments () {
  for i in "$@"; do printf '%s\n' "$i"; done
}
print_arguments 'hello world' '*' 'special  !\characters' '-n' # prints 4 lines
print_arguments ''                                             # prints one empty line
print_arguments                                                # prints nothing
5
13.04.2017, 15:36
2 ответа
[

] Попробуйте настроить вывод []showkey[] на небуферизацию командой [][]stdbuf[][] :[

] [
stdbuf -o0 showkey -a | cat -
] [

]Покажет вывод как нажаты клавиши, а не как буферизация строки. [

] [

][]stdbuf[] может настроить буферизацию []stdin[], []stdout[] и [] stderr[], установив их на []none[], []буферизованную строку[], или []буферизованный блок[], при этом размер блока может быть выбран. Очень удобно. [

].
4
27.01.2020, 20:36

Он буферизирует, потому что ваш терминал настроен на линейно-ориентированную линейно-дисциплину. Вам нужно stty raw . Попробуйте следующее:

state=$(stty -g) 
key=$( (stty raw ; dd bs=1 count=1; stty $state) </dev/tty 2>/dev/null) 

Но это будет работать только для однобайтовых клавиш. Может быть хорошей идеей сначала сделать LC_ALL=C, если есть вероятность, что вход может содержать многобайтовые кепрессы. Более сложный пример может выглядеть следующим образом:

{   exit=$(printf '\003')
    tty_state=$(stty -g)
    stty raw istrip
    while key=$(
        dd bs=1 count=1
    ) ; do : "${key:=
}";     printf " %03o %03d %#x\n\r" \
            "'$key" "'$key" "'$key"
        [ -z "${key#"$exit"}" ] && {
            stty "$tty_state"
            break
        }
    done 2>/dev/null
} </dev/tty
4
27.01.2020, 20:36

Теги

Похожие вопросы