"command || true" パターンはなぜ役に立ちますか?

"command || true" パターンはなぜ役に立ちますか?

私は現在Debianパッケージを閲覧しており、いくつかのコード例を読んでいます。たとえば、postinstスクリプトの各行はパターンです。

some command || true
another command || true

したがって、一部のコマンドが失敗した場合、その行はtrueを返しますが、これがプログラムの出力にどのような影響を与えるかはわかりません。

答え1

このパターンの理由は、Debianパッケージのメンテナスクリプトがで始まる傾向があるためですset -e。これにより、すべてのコマンド(厳密にはパイプ、リスト、または複合コマンド)がゼロ以外の状態で終了するとすぐにシェルが終了します。これはエラーを蓄積しません。問題が発生するとすぐにスクリプトがハングします。

スクリプトのコマンドが失敗する可能性がある場合、追加すると|| true生成された複合コマンドは常にステータス0で終了するため、スクリプトは中断されません。たとえば、ディレクトリを削除することは致命的なエラーではありません(パッケージが削除されるのを防ぎます)。

rmdir ... || true

rmdirエラーを無視するように指示するオプションがないためです。

答え2

実行したばかりのプログラムの出力には影響しませんが、呼び出し側は将来のロジックに影響を与えず、すべてが正常であるかのように続行できます。

言い換えれば、エラーをマスクします。状態前のコマンドの

michael@x071:[/usr/sbin]cat /tmp/false.sh
#!/bin/sh
false

michael@x071:[/usr/sbin]cat /tmp/true.sh 
#!/bin/sh
false || true

michael@x071:[/usr/sbin]sh /tmp/false.sh; echo $?
1
michael@x071:[/usr/sbin]sh /tmp/true.sh; echo $? 
0

関連情報