出力をパイプで接続せずにコンソールに/ Teeを印刷します。

出力をパイプで接続せずにコンソールに/ Teeを印刷します。

次のパイプに別のものを渡しながら、1つを印刷したりコンソールに送信したりする方法はありますか?それは次のとおりです。

echo dog | printOrWhatnot "PUTTING MY THING DOWN" | sed 's/dog/cat/g' | printOrWhatnot "FLIP IT"|rev

結果は次のとおりです。

PUTTING MY THING DOWN
FLIP IT
tac

編集する:これは複数行の入力にも機能します。

printOrWhatNot() {...}

seq 10 30 |printOrWhatNot searching for 3s | grep 3

出力されます

searching for 3s
13
23
30

Larsの答えは最初の入力だけを渡すようです(ここでは10)。

また、理想的には、処理中に出力がインライン化されます。これはGlennの答えで見たものとは異なります。だから

seq 10 30 |tee /dev/tty |printOrWhatNot searching for 3s | grep 3

次の点に役立ちます。

10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
searching for 3s
13
23
30

答え1

私はこの目的のための標準コマンドを知りませんが、小さなシェルスクリプトを使って自分で書くのは簡単です。次を生成して実行可能にし、その場所をPATHに追加します。

編集する- 複数行の標準入力を処理し、入力時にスペースを処理するように更新されました。

印刷しても何でも:

 #!/bin/bash
 # printOrWhatnot script, to re-pipe stdin, while echoing something else via stderr

 # read stdin (possibly multi-lined) into $my_array[]:
 while read -t 1  piped
 do
    my_array=("${my_array[@]}" "$piped")
 done

 # echo the supplied arguments by sending them to stderr:
 echo "$@" 1>&2

 # now spew $my_array[], line by line, to any further processing:
 arrayLen=${#my_array[@]}
 for (( i=0; i<$arrayLen; i++ ));
 do
    echo ${my_array[$i]}
 done

今提案したように動作します。

 myhost> echo dog | printOrWhatnot "PUTTING MY THING DOWN" | sed 's/dog/cat/g' | printOrWhatnot "FLIP IT"|rev
 PUTTING MY THING DOWN
 FLIP IT
 tac

答え2

stdout以外のファイル記述子にメッセージを送信し、stdinを変更せずにstdoutにダンプする必要があります。

printOrWhatnot() { echo "$@" >&2; cat -; }

(最終的に)標準出力にメッセージが表示されるようにするには、パイプを中かっこに変更またはrev包みます。rev 2>&1

{
    echo dog | 
    printOrWhatnot "PUTTING MY THING DOWN" | 
    sed 's/dog/cat/g' | 
    printOrWhatnot "FLIP IT" |
    rev
} 2>&1 

関連情報