条件式の「set -e」での「eval」の動作
コマンドを検討する 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 …