コマンドを考える
eval false || echo ok
echo also ok
通常、ユーティリティを実行し、false
終了ステータスがゼロではないため、echo ok
およびを実行しますecho also ok
。
これは私が使用しているすべてのPOSIX様シェル(ksh93
、、 OpenBSD zsh
、bash
および)で発生しますが、これを有効にすると状況が面白くなります。dash
ksh
yash
set -e
set -e
有効な場合、OpenBSDsh
とksh
シェル(両方から派生pdksh
)が実行されますeval
。他のシェルはこれを行うことはできません。
POSIX と特別な組み込みユーティリティ(例:)eval
のエラーのため、非対話型シェルを終了する必要があります。実行が「エラー」を構成しているかどうかは完全にはわかりません(そうであれば、false
アクティブ状態とは何の関係もありません)。set -e
eval
この問題の解決策はサブシェルに入れることです。
( eval false ) || echo ok
echo also ok
問題は、POSIX正しいシェルスクリプトでこれを行う必要がありますか、それともOpenBSDシェルのバグですか?また、上記のPOSIXテキストで「エラー」とはどういう意味ですか?
echo ok
追加情報:OpenBSDシェルは、コマンドを使用または使用せずに実行されます。set -e
eval ! true || echo ok
私の元のコードは次のとおりです。
set -e
if eval "$string"; then
echo ok
else
echo not ok
fi
これはいいえnot ok
OpenBSDシェルの出力string=false
(終了)を使用すると、これが意図的なものか、バグや誤解なのか、それとも別のものかはわかりません。
ベストアンサー1
他のシェルにはこれらの回避策は必要ありません。これは、これがOpenBSD kshのバグであることを強く示唆しています。実際、ksh93にはそのような問題はありません。
||
シェルを終了させる戻りコードが左側に1になるのを避ける必要があるコマンドラインがあります。
エラーは次のとおりです。特別な組み込みにより非対話型シェルが終了します。POSIXによるとしかし、必ずしもそうではありません。continue
ループから抜け出そうとするのはエラーで、continue
組み込みです。ただし、次の状況では、ほとんどのシェルは終了しません。
continue 3
明らかなエラーを発生させるが終了しない組み込み関数です。
したがって、終了はコマンドの組み込み機能(この場合)ではなく条件によって生成されますfalse
。set -e
eval
POSIXでは、正確な終了条件はやや曖昧ですset -e
。