Warum steht im RM-Handbuch, dass wir es ohne Argumente ausführen können, wenn das nicht stimmt?

Warum steht im RM-Handbuch, dass wir es ohne Argumente ausführen können, wenn das nicht stimmt?

Wir können sehen, dass die Zusammenfassung des rmBefehls wie folgt lautet:

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

Bedeutet das nicht, dass wir nur rmden Befehl ohne Option oder Argument verwenden können?
Wenn ich den Befehl rmallein ausführe, zeigt das Terminal den folgenden Fehler an:

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

Kann mir jemand sagen, warum das so ist?

Antwort1

Die Standardzusammenfassung des rmDienstprogramms ist angegebenim POSIX-Standard1&2 als

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

In der ersten Form ist mindestens ein Dateioperand erforderlich, in der zweiten Form jedoch nicht.

Das Ausführen rm -fohne Dateioperanden ist kein Fehler:

$ rm -f
$ echo "$?"
0

... aber es bewirkt einfach nicht viel.

Der Standard besagt, dass das Dienstprogramm für diese -fOption ...rm

Fordern Sie nicht zur Bestätigung auf. Schreiben Sie keine Diagnosemeldungen und ändern Sie den Beendigungsstatus nicht, wenn keine Dateioperanden vorhanden sind oder wenn Operanden nicht vorhanden sind. Alle vorherigen Vorkommen der -iOption werden ignoriert.

Dies bestätigt, dass die Ausführung rm -fohne Pfadnamenoperanden möglich sein muss und dass dies weder zu einer rmBeendigung mit einer Diagnosemeldung noch zu einem Beendigungsstatus ungleich Null führt.

Diese Tatsache ist sehr nützlich in einem Skript, das versucht, eine Anzahl von Dateien zu löschen,

rm -f -- "$@"

wobei es "$@"sich um eine Liste von Pfadnamen handelt, die leer sein können, aber nicht müssen, oder die Pfadnamen enthalten können, die nicht existieren.

( rm -fwird immer noch eine Diagnosemeldung generieren und mit einem Exit-Status ungleich Null beendet, wennBerechtigungsproblemeVerhindert das Löschen einer benannten Datei.)

Das Ausführen des Dienstprogramms ohne Option oder Pfadnamenoperanden führt jedoch zu einem Fehler:

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

Dasselbe gilt für GNU rm(oben wird OpenBSD gezeigt rm) und andere Implementierungen desselben Dienstprogramms, aber die genaue Diagnosemeldung und der von Null verschiedene Exit-Status können unterschiedlich sein (unter Solaris ist der Wert beispielsweise 2 und unter macOS 64).

Zusammenfassend lässt sich sagen, dass das GNU- rmHandbuch möglicherweise etwas ungenau ist, da bei einigen Optionen ( -f, die eine optionale Option sind) der Pfadname-Operand optional ist.


1 seit der Ausgabe 2016, nach Beschluss desdieser Fehler, sehendie vorherige Ausgabeals Referenz.
2 POSIX ist der Standard, der definiert, was ein Unix-System ist und wie es sich verhält. Dieser Standard wird veröffentlicht vonDie offene Gruppe. Siehe auch die Frage "Was genau ist POSIX?".

Antwort2

Technisch gesehen ist die Zusammenfassung korrekt, aber sie ist verwirrend. Es gibt Fälle, in denen kein Dateiname erforderlich ist:

rm --help
rm --version

(bei Verwendung von GNU rm). In allen anderen Fällen ist ein Dateiname erforderlich.

Andere Versionen rmzeigen die Datei als nicht optional an,z.BIndie OpenBSD-Manpage.

Eine genauere Zusammenfassung für GNU rmwürde die drei Varianten zeigen:

rm[Optionen...]Datei...
rm --help
rm --version

verwandte Informationen