2016-03-30 5 views
4

私はhereそのテストを参照してくださいか?ゼロ(成功)か何か他のもの(失敗)は反パターンですが、私はこれをどこでも見つけることができませんでした。

Wikipediaのアンチパターンの定義に固執する:「アンチパターン(またはアンチパターン)は、通常有効でなく、非常に非生産的なリスクを繰り返す問題に対する共通の対応です」なぜこれは反パターンだろうか?

+0

「通常は無効」は、その定義の考えにくいコンポーネントです。ネガティブなトレードオフなしに大きな落とし穴や警告に対処するベストプラクティスの代替品があれば、何かが反パターンになる可能性があります。確かに、反パターンであるいくつかの事柄は、セキュリティリスクをもたらすため、そうしたものです。その脆弱性を持つコードを受け入れられないようにするためにセキュリティバグを悪用する必要があります。 –

+0

...反パターンの使用は無効になる傾向があります。それはよりふさわしく、従って論争することは難しい。 –

答えて

9

これは、終了ステータスをまったく記録する必要がない場合は存在しない複雑さを導入するため、反パターンです。

if your_command; then ... 

間違って行くことができるものの例については

your_command 
if [ "$?" -eq 0 ]; then ... 

よりも間違って行くことがはるかに少ないがあります:$?を修正、デバッグ用の追加についてtraps、あるいは新しいecho文を考えてみてください。読者にとって、your_commandを実行している別の行には、論理フローを変更することなく、その下に何も追加することはできません。ある

your_command 
echo "Finished running your_command" >&2 
if [ "$?" -eq 0 ]; then ... 

は... 、ない実際のコマンドをエコーチェックしています。


したがって、あなたは本当にはすぐにその値がゼロであるかどうかに分岐するよりも細かいやり方で終了ステータスに対処する必要を行う場合には、あなたが同じ行にそれを収集する必要があります。

# whitelisting a nonzero value for an example of when "if your_command" won't do. 
your_command; your_command_retval=$? 
echo "Finished running your_command" >&2 ## now, adding more logging won't break the logic. 
case $your_command_retval in 
    0|2) echo "your_command exited in an acceptable way" >&2;; 
    *) echo "your_command exited in an unacceptable way" >&2;; 
esac 

は最後に:あなたはif文の内部でyour_commandを囲むとあなたのシェルがconsiないように、をテストしたように、これはそれをマークset -eまたはERRのトラップのために0以外の終了ステータスを返します。

したがって:

set -e 
your_command 
if [ "$?" -eq 0 ]; then ... 

... set -eの振る舞いを悩ませてコーナーケースと警告の数がなければない)んとして、0以外$?の任意の値でif文を達しますその場合、set -eは強制的に終了します。これとは対照的に:

set -e 
if your_command; then ... 

...テストとしてyour_commandの終了ステータスをマークし、それがset -eごとに終了するためのスクリプトを強制的に引き起こさ考慮しません。

+0

興味深い。しかし、バイナリ/ブール値として使用されている場合にのみ、それは反パターンである – KevinDTimm

+0

@KevinDTimmです。言語機能には用途があります。それが呼び出されていないときにそれを使用することは、何が目立つのですか? –

+0

@KevinDTimm、...そして、タイトルは明示的に "コマンドが成功したかどうかを見る"というユースケースを呼び出します。 - そのコマンドがゼロ/ゼロ以外の終了ステータス規則に従うならば、それが本当に成功したかどうかを判断するのは真偽判定です。 –

関連する問題