web-dev-qa-db-ja.com

これが当てはまらない場合、なぜrm manualは引数なしで実行できると言うのですか?

rmコマンドの概要は次のとおりです。

rm [OPTION]... [FILE]...

オプションや引数なしでrmコマンドのみを使用できるという意味ではありませんか?
コマンドrmを単独で実行すると、端末に次のエラーが表示されます。

rm: missing operand
Try 'rm --help' for more information.

これが事実である理由を誰かに教えてもらえますか?

rmユーティリティの標準的な形式は、POSIX標準で指定されています1&2 なので

rm [-iRr] file...
rm -f [-iRr] [file...]

最初の形式では少なくとも1つのファイルオペランドが必要ですが、2番目の形式では必要ありません。

ファイルオペランドなしでrm -fを実行してもエラーにはなりません。

$ rm -f
$ echo "$?"
0

...しかし、それはあまり効果がありません。

標準では、-fオプションの場合、rmユーティリティは...

確認を求めません。ファイルオペランドがない場合、またはオペランドが存在しない場合は、診断メッセージを書き込んだり、終了ステータスを変更したりしないでください。以前に発生した-iオプションは無視されます。

これは、パス名のオペランドなしでrm -fを実行できる必要があることと、これがrmを診断メッセージやゼロ以外の終了ステータスで終了させるものではないことを確認しています。

この事実は、多数のファイルを削除しようとするスクリプトで非常に役立ちます。

rm -f -- "$@"

ここで、"$@"は、空のパス名または空でないパス名、または存在しないパス名が含まれている可能性があるパス名のリストです。

rm -fは、診断メッセージを生成し、アクセス許可の問題がある場合指定されたファイルが削除されました。)

ただし、オプションとパス名のどちらのオペランドも指定せずにユーティリティを実行すると、エラーになります。

$ rm
usage: rm [-dfiPRrv] file ...
$ echo "$?"
1

同じことがGNU rm(上記はOpenBSD rmを示しています)と同じユーティリティの他の実装にも当てはまりますが、正確な診断メッセージと非ゼロの終了ステータスは異なる場合があります(たとえば、Solarisでは値は2、macOSでは64です)。

結論として、GNU rmマニュアルは、いくつかのオプション(-f、オプションのオプション)、パス名があることは事実なので、少し不正確かもしれませんオペランドはオプションです。


12016年版以降、 このバグ の解決後、 前版 を参照してください。
2POSIXは、Unixシステムとは何か、その動作を定義する規格です。この標準は The Open Group によって公開されています。 「 POSIXとは正確には何ですか? 」の質問も参照してください。

45
Kusalananda

技術的には、概要は正しいですが、混乱を招きます。ファイル名が必要ない場合があります:

rm --help
rm --version

(GNU rmを使用する場合)。その他の場合はすべてファイル名が必要です。

他のバージョンのrmは、ファイルをオプションではないものとして表示します--e.g。 in OpenBSD manpage

GNU rmのより正確な概要は、3つのバリアントを示します。

rm [オプション ...] ファイル ...
rm --help
rm --version

9
Stephen Kitt