標準入力(Stdin)を読み、パイプとしてTeeに接続

標準入力(Stdin)を読み、パイプとしてTeeに接続

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

私は何が起こっているのか理解し、catstdinをに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つの解決策が見つかりました。

  1. 出力バッファリングなしで実行する場合stdbufawk

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

  2. スクリプトへのsystem("")呼び出しの追加awk

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

おすすめ記事