6

途中でパイプの内容を出力したい場合があります (皆さんそうではありませんか?)。

私は通常、次のようにします(はい、おそらくもっと良い方法が他にもあることを知っています):

terminal=$(tty) 
echo hello world |tee $terminal|awk '{print $2, $1}'

出力する

hello world
world hello

これは素晴らしいことであり、すべての点で素敵です。

$terminal 変数を作成せずに本当にやりたいことを除いて。簡単ですよね、パイプ内tee $terminalで ' ' を ' tee $(tty)' に置き換えるだけで、変数は不要ですか? 右?

違う。

echo hello world |tee $(tty)|awk '{print $2, $1}'

出力

world hello

つまり、パイプの途中からの出力が飲み込まれました。

これが間違いなく第一世界の問題であることは認めていますが、それは私を悩ませており、2 番目の解決策がうまくいかない理由を知りたいと思っています。

誰?

4

2 に答える 2

7

システムがサポートしている場合は、次のコマンドで現在の端末に直接アクセスできます/dev/tty

echo hello world | tee /dev/tty | awk '{print $2, $1}'

(いずれにせよ、このファイルは Linux と Mac OS X で利用できます。)

このttyコマンドは、標準入力に接続されたファイルの名前を返しますが、これは必ずしも端末であるとは限りません。パイプでは、前のコマンドの標準出力に関連付けられた「ファイル」です。

于 2013-05-22T14:37:11.240 に答える
1

teeシステムでサポートされている場合は、プロセス置換でも使用できます。

echo hello world | tee  >(awk '{print $2, $1}')

行が遅すぎる場合があるため、必要に; sleep .01応じて最後に追加する必要がある場合があります。

または、レポートに標準エラーを使用できます。

echo hello world | tee >(cat >&2) |  awk '{print $2, $1}' 
于 2013-05-22T14:40:31.610 に答える