サブシェルでエラーを抑制しますか?

サブシェルでエラーを抑制しますか?

特定のポイント以降、サブシェルのエラーを抑制したいと思います。

私はこの状況を示すためにスクリプトを書いた。

worked=false
(echo Starting subshell process \
    && echo If this executes process is considered success \
    && false \
    && echo run if possible, but not an error if failed) \
  && worked=true

echo $worked

プロセスが機能しているかどうかをシェルに報告したいと思います。

また、作業変数をサブシェルに入れることも検討しました。

    && echo This works process worked: \
    && worked=true \
    && false \
    && echo run if possible, but not an error if failed)

ただし、この方法も機能しません。なぜなら、サブシェルの内部に変数を設定しても基本スクリプトには影響しないからです。

ベストアンサー1

これはどうですか

worked=false
(
    set -e
    echo Starting subshell process
    echo If this executes process is considered success
    false
    echo run if possible, but not an error if failed || true
)
[[ 0 -eq $? ]] && worked=true

echo "$worked"

set -e保護されていないエラーが見つかった場合、サブシェルは終了します。この|| true構成は、失敗する可能性があるステートメントを保護し、サブシェルが終了することを望ましくありません。

サブシェルが成功したかどうかを知りたい場合は、$workedこの変数を完全に省略できます。

(
    set -e
    ...
)
if [[ 0 -eq $? ]]
then
    echo "Success"
fi

コマンドが失敗した場合は、サブシェルですぐに実行を中止したい場合、または同じ構文を使用することはset -eできません。これはマニュアルページに文書化されていますが、最初は見逃しました。( set -e; ... ) && worked=trueif ( set -e; ...); then ... fibash

複合コマンドまたはシェル関数が無視されたコンテキストで実行された-eときに設定されると、-e複合コマンドまたは関数呼び出しを含むコマンドが完了するまで設定は適用されません。

おすすめ記事