키보드에서 어떤 키를 눌렀는지 알고 그 정보를 표준 출력으로 인쇄하고 싶습니다.
이를 수행할 수 있는 도구는 입니다 . 그러나 데이터를 다음으로 showkey
전달하려는 경우 :showkey
read
while read line; do
echo "$line" | otherprog
done <`showkey -a`
또는
showkey -a | while read line; do
echo "$line" | otherprog
done
그런 다음 showkey
총 140자가 입력될 때까지 기다린 다음 버퍼링된 정보를 으로 보냅니다 read
.
showkey -a
버퍼링 없이 누른 키를 한 줄씩 인쇄합니다.
- 버퍼링하는 이유는 무엇입니까?
showkey
실제로 출력을 한 줄씩 읽을 수 있도록 이러한 버퍼링을 방지하려면 어떻게 해야 합니까 ?- 어떤 대안이 있습니까
showkey
? - 누른 키를 직접 읽을 수 있는 파일이 있나요?
- 데이터를 에 전달하는 올바른 방법은 무엇입니까
read
?
해결책:
나는 사용했다로닉스의 솔루션그리고 그것을 내 간단한 키보드에 포함시키세요 :D!
stdbuf -o0 showkey -a | while read line; do
perl -e 'print sprintf "%030s\n",shift' "$line" | aplay &> /dev/null &
done
레이저 선박 버전:
#!/bin/bash
MP3=(); for i in mp3/*.mp3; do MP3+=("$i"); done
NMP3=${#MP3[@]}
stdbuf -o0 showkey -a 2>/dev/null | while read line; do
[ -z "$line" ] || ! [[ $line =~ ^[0-9] ]] && continue
NUM="$(echo "$line" | awk '{print $2}')"
mplayer "${MP3[$(($NUM % $NMP3))]}" &>/dev/null &
done
같은 폴더에,일부 레이저 mp3 파일 다운로드라는 폴더에 mp3
.
답변1
showkey
다음을 사용하여 출력을 버퍼링되지 않은 상태로 설정해 보세요 .stdbuf
주문하다:
stdbuf -o0 showkey -a | cat -
라인을 버퍼링하는 대신 키를 누를 때 출력이 표시됩니다.
stdbuf
stdin
stdout
의 버퍼링을 조정할 수 있으며 , stderr
로 설정하여전혀,라인 버퍼, 또는블록 버퍼, 선택 가능한 블록 크기가 있습니다. 매우 편리합니다.
답변2
터미널이 선 중심 선 규칙으로 설정되어 있기 때문에 버퍼링됩니다. 당신은해야합니다 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