🧑‍💻

パイプで途中経過を表示したい時の解決法

に公開

今日は、シェルスクリプトについて書きます。

シェルのパイプで色々と繋げて処理をする際に、途中経過を表示したい時がありました。

どうやったら綺麗に解決できるかと思って、検討しました。

解決策

>&2 をつけることで、途中経過を表示できます。

echo "hello world" | xxd -p >&2 | xxd -r -p

解説

このサンプルコードは、hello world を、16進数表示をして、68656c6c6f20776f726c640aとし、もう一度、hello world に戻すというコードです。
最近OSレベルのコードにハマっているため、少しマニアックなコードです。

>&2をつけると、下記のように、パイプラインの途中経過を標準エラー出力に出力できます。
途中経過68656c6c6f20776f726c640aが、ターミナルの画面に出るということですね。

~ # echo "hello world" | xxd -p >&2 | xxd -r -p 
68656c6c6f20776f726c640a
hello world

>&2 の意味は、標準出力1を標準エラー出力2にコピーするという意味です。
省略せずに書くと、1>&2ですが、最初の1は省略できます。
n>&mのnやmをファイルディスクリプタと言います。
これにより、途中経過をターミナルの画面に表示することができます。

その他の方法

他に、tee /dev/stderr も類似のことができます。

 ~  echo "hello world" | xxd -p | tee /dev/stderr | xxd -r -p
68656c6c6f20776f726c640a
hello world

Discussion