bashでパイプの間を覗き見るTIPS

ファイルを書き出せば充分なんだけど…bashでパイプの間を覗き見たいとおもった。

teeと/dev/stderr を組み合わせればすぐに着陸できる。

$ echo -e "hello world\nfoo bar buzz\n" | tee /dev/stderr | sed 's/ /,/' | tee /dev/stderr | sed 's/,/:/'
hello world
foo bar buzz

hello,world
foo,bar buzz

hello:world
foo:bar buzz

すごく悩んでしまった。

と、いうことで 整形前、整形後、実行後という表示も可能になる

$ echo -e 'main(){\nprintf("hello world\\n");\n}\n'|tee /dev/stderr | indent2 c | tee /dev/stderr| rungcc 
main(){
printf("hello world\n");
}

main(){
  printf("hello world\n");
}

hello world

逆になるけど/dev/fd/3を使う手もある

$ echo -e "hello world\nfoo bar buzz\n" | (tee /dev/fd/3  | sed 's/ /,/') 3>&1
hello,world
foo,bar buzz

hello world
foo bar buzz

~/.bashrcに以下を書いておけばもすこし使いやすいかな。

 alias peek='{ tee /dev/stderr;echo "***">/dev/stderr; }'

そうか、バッファがフラッシュするタイミングが違うな。あまり多用できないな(笑

$ echo -e "hello world\nfoo bar buzz\n" | peek | sed 's/ /,/' 
hello world
foo bar buzz

hello,world
foo,bar buzz

***
$ echo -e "hello world\nfoo bar buzz\n" | peek | sed 's/ /,/' | peek | sed 's/,/:/' 
hello world
foo bar buzz

***
hello,world
foo,bar buzz

hello:world
foo:bar buzz

***