stderrに何かが書き込まれたら実行を停止します。

stderrに何かが書き込まれたら実行を停止します。

Bashスクリプトでエラーを処理する際に問題があります。これまでbashで見たエラー処理ソリューションのどれも、このサンプルスクリプトでは機能しないようです。

#!/usr/bin/env bash
set -euo pipefail

eval $(do_stuff)
touch file

出力は次のとおりです

./script.sh: line 4: do_stuff: command not found

しかし、それにもかかわらず幸せにファイルを生成し続けますが、これが私が無効にしたいものです。私はstderrを別のプログラムにパイプし、出力を取得しながらプログラム全体を終了できると思いました。

unbuffer ./script.sh 2>&1|{ while read stdin; do echo $stdin;killall -9 bash;done; }

ただし、これは約5%の時間でのみ機能します。ほとんどの場合、スクリプトは早期に終了しません。

ベストアンサー1

私が投稿したイベントをエレガントに処理する方法を見つけました。

eval() {
    if [[ -z "${@}" ]];then
        exit 1
    fi
    builtin eval "$@"
}

デフォルトの eval() 実装をオーバーライドし、入力が受信されない場合は終了します。ただし、この回答は依然として質問の件名に対する回答ではないため、受け入れません。

おすすめ記事