xinput
키보드 이벤트를 보면서 놀고 있어요 . 변환 출력을 사용하여 awk
에 전달하고 tee
, stdout으로 인쇄하고, 동시에 파일에 쓰고 싶습니다.
저는 장치 14에서 이벤트를 보고 있습니다. Single 을 입력한 Space다음 Enter Ctrl+ CExit를 입력합니다.
$ xinput test 14
key release 36
key press 65
key release 65
key press 37
key press 54
^C
다음을 사용하여 변경할 수 있습니다 awk
.
$ xinput test 14 | awk '{ print $NF }'
36
65
65
37
54
^C
아니면 다음으로 파이프할 수 있습니다 tee
.
$ xinput test 14 | tee a.log
key release 36
key press 65
key release 65
key press 37
key press 54
^C
$ cat a.log
key release 36
key press 65
key release 65
key press 37
key press 54
하지만 변환된 출력을 다음으로 파이프할 수는 없습니다 tee
.
$ xinput test 14 | awk '{ print $NF }' | tee b.log
^C
$ cat b.log
나는 무슨 일이 일어나고 있는지 이해하고 cat
stdin을 로 tr
전송하고 tee
.
$ cat | tr a x | tee x.log
+ 를 입력한 A B Enter다음 stdout으로 인쇄하거나 쓰기 전에 파이프가 중단됩니다 (파일 자체가 생성되더라도).CtrlCx.log
ab
^C
$ cat x.log
Ctrl+ D대신 Ctrl+ 를 입력하면 문자 C하나 EOF
가 입력의 끝을 나타내고 출력은 표준 출력으로 인쇄되어 다음과 같이 작성됩니다 x.log
.
ab
xb
$ cat x.log
xb
나는 몇 가지 다른 접근 방식을 시도했지만 지금까지 성공하지 못했습니다.
$ { xinput test 14 | awk '{ print $NF }' ; } > >(tee x.log)
$ exec {fd}> >(tee x.log)
$ xinput test 14 | awk '{ print $NF }' >& ${fd}
$ exec {fd}>&-
$ exec > >(tee x.log)
$ xinput test 14 | awk '{ print $NF }'
이것이 가능합니까?
답변1
두 가지 해결책을 찾았습니다.
출력 버퍼링 없이 실행하는 경우
stdbuf
.awk
xinput test 14 | stdbuf -o0 awk '{ print $NF }' | tee b.log
스크립트에
system("")
호출 추가awk
xinput test 14 | awk '{ print $NF; system("") }' | tee b.log