GNU/Linux >> Linux の 問題 >  >> Linux

なぜ rm マニュアルは引数なしで実行できると言っているのに、これは正しくないのですか?

rm の標準的な概要 utility は POSIX 標準で次のように指定されています

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

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

rm -f を実行しています ファイルオペランドなしはエラーではありません:

$ rm -f
$ echo "$?"
0

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

標準では、-f に対して オプション、rm ユーティリティは...

<ブロック引用>

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

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

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

rm -f -- "[email protected]"

どこで "[email protected]" 空であるかどうか、または存在しないパス名を含む可能性のあるパス名のリストです。

(rm -f 権限の問題がある場合は、引き続き診断メッセージを生成し、ゼロ以外の終了ステータスで終了します 指定されたファイルが削除されるのを防ぎます)

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

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

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

結論として、GNU rm いくつかのオプション (-f 、これはオプションのオプションです)、パス名オペランドはオプションです。

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


技術的には、あらすじは正しいのですが、ややこしいです。ファイル名が不要な場合もあります:

rm --help
rm --version

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

rm の他のバージョン ファイルを非オプションとして表示します。

GNU rm のより正確な概要 3 つのバリアントが表示されます:

<ブロック引用>

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


Linux
  1. Bash翻訳ファイルにすべてのエラーテキストが含まれていないのはなぜですか?

  2. なぜ`exit&`が機能しないのですか?

  3. Unix では、最初にそのディレクトリに cd を実行せずにディレクトリで 'make' を実行できますか?

  1. read(2) は EOF でないときにゼロを返すことができますか?

  2. このシェル パイプラインが終了するのはなぜですか?

  3. Windows が Linux パーティション内のファイルを認識しないのはなぜですか?

  1. 一部のコマンドでBashプロセス置換が機能しないのはなぜですか?

  2. この正規表現が Linux で機能しないのはなぜですか?

  3. このファイルを root として削除できないのはなぜですか?