현재 누른 키를 표준 출력으로 인쇄하고 한 줄씩 읽습니다.

현재 누른 키를 표준 출력으로 인쇄하고 한 줄씩 읽습니다.

키보드에서 어떤 키를 눌렀는지 알고 그 정보를 표준 출력으로 인쇄하고 싶습니다.

이를 수행할 수 있는 도구는 입니다 . 그러나 데이터를 다음으로 showkey전달하려는 경우 :showkeyread

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버퍼링 없이 누른 키를 한 줄씩 인쇄합니다.

  1. 버퍼링하는 이유는 무엇입니까?
  2. showkey실제로 출력을 한 줄씩 읽을 수 있도록 이러한 버퍼링을 방지하려면 어떻게 해야 합니까 ?
  3. 어떤 대안이 있습니까 showkey?
  4. 누른 키를 직접 읽을 수 있는 파일이 있나요?
  5. 데이터를 에 전달하는 올바른 방법은 무엇입니까 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 -

라인을 버퍼링하는 대신 키를 누를 때 출력이 표시됩니다.

stdbufstdinstdout의 버퍼링을 조정할 수 있으며 , 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

관련 정보