표준 입력(Stdin)을 읽고 파이프로 티(Tee)로 연결

표준 입력(Stdin)을 읽고 파이프로 티(Tee)로 연결

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

나는 무슨 일이 일어나고 있는지 이해하고 catstdin을 로 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

두 가지 해결책을 찾았습니다.

  1. 출력 버퍼링 없이 실행하는 경우 stdbuf.awk

    xinput test 14 | stdbuf -o0 awk '{ print $NF }' | tee b.log

  2. 스크립트에 system("")호출 추가awk

    xinput test 14 | awk '{ print $NF; system("") }' | tee b.log

관련 정보