p.tatapa.org

p.tatapa.org

UNIXシェルバッドノウハウメモ: set -o errexit -o pipefail とした上で foo | head -n 10 とすると、fooがSIGPIPEで異常終了するので全体も異常終了する。

UNIXシェルバッドノウハウメモ: set -o pipefailとした上で、 if foo | grep -q bar ; ... とすると、fooがSIGPIPEを受け取ってifの条件が偽になる場合がある(fooがbarを出力してから、さらに別のwriteで何かを出力しようとしたとき)。

Elvishではこのあたりを特別扱いしてくれる。パイプラインのいずれかのコマンドが失敗した場合は例外となるが、途中のコマンドがSIGPIPEで失敗した場合は無視する。

https://elv.sh/ref/language.html#pipeline-exception

replies
1
announces
0
likes
0

Nushellの場合、外部コマンドが失敗した場合は例外が起きるが、SIGPIPEは例外を起さない(バージョン0.98.0、2024年9月17日リリース)。 https://www.nushell.sh/blog/2024-09-17-nushell_0_98_0.html#non-zero-exit-codes-are-now-errors-toc

ただし、pipefail相当の設定はつい最近実験的機能として導入され、それまではパイプラインの最後のコマンドの失敗のみが例外となっていた(バージョン0.108.0、2025年10月15日リリース)。 https://www.nushell.sh/blog/2025-10-15-nushell_v0_108_0.html#pipefail-16449-toc

YSH (Oils)は、デフォルトでpipefail相当(よりもさらに強力)かつSIGPIPEを正常終了として扱う。
https://oils.pub/release/latest/doc/error-handling.html