🧑💻
パイプで途中経過を表示したい時の解決法
今日は、シェルスクリプトについて書きます。
シェルのパイプで色々と繋げて処理をする際に、途中経過を表示したい時がありました。
どうやったら綺麗に解決できるかと思って、検討しました。
解決策
>&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