web-dev-qa-db-ja.com

パターン「コマンド|| true」が役立つのはなぜですか?

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

some command || true
another command || true

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

84
carpenter

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

スクリプト内のコマンドの失敗が許可されている場合、|| trueを追加すると、結果の複合コマンドが常にステータス0で終了するため、スクリプトは中止されません。たとえば、ディレクトリの削除は致命的なエラーではありません(パッケージが削除されないようにすること)。だから私たちは

rmdir ... || true

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

157
Stephen Kitt

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

言い換えると、前のコマンドのエラーstatusがマスクされます。

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
33
Michael Felt