答えて
これは、終了ステータスをまったく記録する必要がない場合は存在しない複雑さを導入するため、反パターンです。
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
ごとに終了するためのスクリプトを強制的に引き起こさ考慮しません。
興味深い。しかし、バイナリ/ブール値として使用されている場合にのみ、それは反パターンである – KevinDTimm
@KevinDTimmです。言語機能には用途があります。それが呼び出されていないときにそれを使用することは、何が目立つのですか? –
@KevinDTimm、...そして、タイトルは明示的に "コマンドが成功したかどうかを見る"というユースケースを呼び出します。 - そのコマンドがゼロ/ゼロ以外の終了ステータス規則に従うならば、それが本当に成功したかどうかを判断するのは真偽判定です。 –
- 1. データベースで削除が成功したかどうかを確認するには?
- 2. ノンブロッキングセンドが成功したかどうかを確認します。
- 3. popen()が成功したかどうかを確認するには?
- 4. WebViewリクエストが成功したかどうかを確認するには?
- 5. Postgresのバックアップが成功したかどうかを確認するには?
- 6. Javaメール。ログインが成功したかどうかを確認するには?
- 7. ストアドプロシージャが成功または失敗したかどうかを確認する
- 8. WinActivateが成功したかどうかを確認するにはどうすればよいですか?
- 9. Informixデータベース12.1のonbarコマンドによるバックアップが成功したかどうかを確認しますか?
- 10. sp_send_dbmailが成功したかどうかを確認
- 11. PowerShellでDSQueryが成功したかどうかを確認しますか?
- 12. mingwが成功したライブラリをコンパイルするかどうかを確認する
- 13. ファイルの削除が成功したかどうかの確認
- 14. ObfuscationがCSharpプロジェクトファイルで成功したかどうかを確認する方法
- 15. マルチパートアップロードがalamofireイメージで成功したかどうかを確認する方法
- 16. MySpaceでログインが成功したかどうかを確認する
- 17. SQLでCOPYが成功したかどうかを確認する方法
- 18. VCBUILDが失敗したか成功したかどうかをバッチスクリプトで確認するには
- 19. コマンドが成功したかどうかを判断するc
- 20. Powershell in MsBuild:スクリプトが成功したかどうかを確認しますか?
- 21. MySQL DELETEが成功したものは何ですか? DELETEが成功したかどうかを確認するには?
- 22. Mage.exeバッチマニフェストの更新が成功したかどうかを確認する - ClickOnce
- 23. mysqlの挿入が成功したかどうかを確認する方法
- 24. boto3 S3.Client.upload_fileobjが成功したかどうかを確認する方法?
- 25. データのインポートが成功したかどうかを確認する方法
- 26. プッシュが成功したかどうかを確認します。 - anglefire2
- 27. レコードの更新が成功したかどうかを確認します。
- 28. SQLクエリがAndroid SQLiteで成功したかどうかを確認
- 29. CodeIgniterでupdate_batch()が成功したかどうか確認してください
- 30. PowerShellでRest Callが成功するかどうかを確認する
「通常は無効」は、その定義の考えにくいコンポーネントです。ネガティブなトレードオフなしに大きな落とし穴や警告に対処するベストプラクティスの代替品があれば、何かが反パターンになる可能性があります。確かに、反パターンであるいくつかの事柄は、セキュリティリスクをもたらすため、そうしたものです。その脆弱性を持つコードを受け入れられないようにするためにセキュリティバグを悪用する必要があります。 –
...反パターンの使用は無効になる傾向があります。それはよりふさわしく、従って論争することは難しい。 –