xinput
キーボードイベントを見ながら遊んでいます。変換出力を使用してawk
に渡しtee
、stdoutで印刷し、同時にファイルに書きたいと思います。
私はデバイス14でイベントを見ています。 Singleと入力し、SpaceEnter 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 Enterstdoutとして印刷するか、書き込み前にパイプが中断されます(ファイル自体が作成されても)。CtrlCx.log
ab
^C
$ cat x.log
Ctrl+Dの代わりにCtrl+を入力すると、C1つの文字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
2つの解決策が見つかりました。
出力バッファリングなしで実行する場合
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