不足しているコマンドによるマルチパイプ損傷の防止

不足しているコマンドによるマルチパイプ損傷の防止

シェルスクリプトでは、次のように複数のパイプを使用することがよくあります。

cmd1 | cmd2 | cmd3

パイプが存在しない場合、cmd2「損傷」が発生し、cmd3入力は受信されません。

回避策としてcmd2が存在するかどうかを明示的にテストできますが、これには避けたいコードの重複が必要です。

代わりに、次のようにもう少し簡潔なテストをしたいと思います。

cmd1 | cmd2; [ $? -eq 127 ] && cat | cmd3

ベストアンサー1

より簡潔にするために、ミニ関数を書くことができます。

ifexists(){
    if command -v "$1"
    then "$@"
    else echo "doing cat for missing $1" >&2
         cat
    fi
}

echo hi | ifexists mycommand | cat -n

おすすめ記事