38002


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


CC BY-SA 3.0
2017-09-17T03:40:22.640
37998
2017-09-20T07:27:09.340
19110
question
bash shellscript sh
rm -f file と rm file || true に差はある？


`rm file || true`だと、そのファイルを消すか尋ねられますが、`rm -f file`だと尋ねられません。`-f`はnever
promptなので。  
前者が尋ねられるかどうかは環境によるかもしれませんが.


CC BY-SA 3.0
2017-09-17T07:58:56.050
38002
2017-09-17T07:58:56.050
19437
37998
answer


`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` のほうが断然安全です。


CC BY-SA 3.0
2017-09-20T07:27:09.340
38063
2017-09-20T07:27:09.340
8589
37998
answer