コマンドを検討する
eval false || echo ok
echo also ok
通常、我々はこれを実行するために期待するfalse
ユーティリティをして、終了ステータスがゼロであることから、その後、実行するecho ok
とecho also ok
。
すべてのPOSIXのような私が使用してシェルでは(ksh93
、zsh
、bash
、dash
、OpenBSDのksh
、とはyash
)、これは何が起こるかですが、私たちは有効にした場合、物事は面白くset -e
。
set -e
が有効な場合、OpenBSD sh
とksh
シェル(どちらもから派生pdksh
)は、の実行時にスクリプトを終了しますeval
。他のシェルはそれを行いません。
POSIXは、特殊な組み込みユーティリティ(などeval
)のエラーにより、非対話型シェルが終了するはずであると述べています。実行がfalse
「エラー」を構成するかどうかは完全にはわかりません(もしそうなら、それはset -e
アクティブであることとは無関係です)。
これを回避する方法eval
は、をサブシェルに置くことです。
( eval false ) || echo ok
echo also ok
問題は、POSIXに準拠した正しいシェルスクリプトでそれを実行する必要があるかどうか、またはOpenBSDのシェルのバグかどうかです。また、上記にリンクされているPOSIXテキストの「エラー」とはどういう意味ですか?
余分な情報:OpenBSDシェルは 、コマンドのecho ok
有無にかかわらず両方を実行しますset -e
eval ! true || echo ok
私の元のコードは次のようになりました
set -e
if eval "$string"; then
echo ok
else
echo not ok
fi
これは、OpenBSDシェルを使用すると出力されません(終了します)。それが設計によるものか、誤っているか、誤解によるものか、または他の何かによるものかどうかはわかりませんでした。not ok
string=false
eval false
AND-ORリストまたは条件ステートメントの一部であっても、スクリプトを終了することを期待しますか?私はしません。
set -e
正しい動作であるかどうかが設定されているかどうかはわかりません...条件付きステートメントで終了しないことが理にかなっていることに同意します。
set -e
する場合の動作であり、 `()`が答えです。
eval false
ゼロ以外のステータスを生成するのでset -e
、その時点でスクリプトを終了する予定です。以下の場合!
set -e
のように適用されない!
文で明示的に終了ステータスをチェックします。