質問: bash で `file` という名前のファイルを削除したいが、そのファイルが存在しなかったときも終了ステータスを `0` にしたいと思い、`rm -f file` を使いました。しばらくして、とある方が同じ目的で `rm file || true` を使っていることを知りました。私の環境ではどちらの場合もスクリプト実行後の `$?` が `0` になってくれたのですが、それ以外の違いがあるのか、`man` を見てもよく分かりませんでした。 質問: `rm -f file` と `rm file || true` の挙動に何か違いはありますか? 特定の環境における差でも構いません。 私の環境: bash 4.3.48(1)-release (x86_64-pc-linux-gnu), rm (GNU coreutils) 8.25
回答: `file` が無いとき - `rm -f file` は無言で終了し終了コード 0 - `rm file || true` は「ファイルがありません」のメッセージを `stderr` に出し終了コード 0 ディレクトリ `hoge` の下にファイル `piyo` があって `cd hoge` してあるものとして `hoge` の権限が `rwx` (ディレクトリ自体には書き込み許可) `piyo` の権限が `r--` (ファイルは書き込み不許可) であるとき (このとき `piyo` は削除可能) - `rm -f piyo` は `piyo` の書き込み不許可を無視して無言で削除を行い終了コード 0 - `rm piyo || true` は確認メッセージを表示し入力待ちとなります。 - 人の介入待ちとなってしまうのでスクリプトや `Makefile` で使うのは困難でしょう。 - 終了コード 0 が得られることに違いはありません。 `hoge` の権限が `r-x` (ディレクトリ自体に書き込み不許可) `piyo` の権限が `r--` (ファイルは書き込み不許可) であるとき (このとき `piyo` は削除不可能) - `rm -f piyo` は `piyo` の削除不能を表示し、終了コード 0 以外を返します - `rm piyo || true` は確認メッセージを表示し入力待ちとなります。 - 人の介入待ちとなってしまうのでスクリプトや `Makefile` で使うのは困難でしょう。 - 削除失敗であっても終了コード 0 を返すので混乱を招くでしょう。 特に `Makefile` 中の `clean:` などに使う場合には `rm -f` のほうが断然安全です。