特定のポイント以降、サブシェルのエラーを抑制したいと思います。
私はこの状況を示すためにスクリプトを書いた。
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=true
if ( set -e; ...); then ... fi
bash
複合コマンドまたはシェル関数が無視されたコンテキストで実行された
-e
ときに設定されると、-e
複合コマンドまたは関数呼び出しを含むコマンドが完了するまで設定は適用されません。
答え2
worked=false
(status=1;
echo Starting subshell process \
&& echo If this executes process is considered success \
&& status=0
&& false \
&& echo run if possible, but not an error if failed;
exit $status) \
&& worked=true
echo $worked
答え3
if
すべてを&&
接続せずにforceコマンドを条件付きで配置できます。
worked=false
( if echo Starting subshell process &&
echo If this executes process is considered success ; then
false &&
echo run if possible, but not an error if failed
exit 0
fi
exit 1 ) && worked=true
echo worked=$worked
答え4
私の解決策は、サブシェルの内部に変数を作成し、その変数に基づいて終了コードを手動で制御することでした。
worked=false
(echo Starting subshell process \
&& echo If this executes process is considered success \
&& check=true \
&& false \
&& echo run if possible, but not an error if failed
if [[ -n "$check" ]]; then exit 0; else exit 1; fi) \
&& worked=true
echo $worked