GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Warum sagt rm manual, dass wir es ohne Argumente ausführen können, wenn das nicht stimmt?

Die Standardzusammenfassung für rm Utility ist im POSIX-Standard als

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

In seiner ersten Form benötigt es mindestens einen Dateioperanden, aber in seiner zweiten Form nicht.

Mache rm -f ohne Dateioperanden ist kein Fehler:

$ rm -f
$ echo "$?"
0

... aber es bringt einfach nicht viel.

Der Standard sagt das für die -f Option, die rm Dienstprogramm sollte...

Nicht zur Bestätigung auffordern. Schreiben Sie keine Diagnosemeldungen und ändern Sie den Exit-Status nicht, wenn keine Dateioperanden vorhanden sind oder wenn Operanden nicht vorhanden sind. Alle früheren Vorkommen von -i Option soll ignoriert werden.

Dies bestätigt, dass es möglich sein muss, rm -f auszuführen ohne irgendwelche Pfadnamen-Operanden und dass dies nichts ist, was rm macht Exit mit einer Diagnosemeldung oder einem Exit-Status ungleich Null.

Diese Tatsache ist sehr nützlich in einem Skript, das versucht, eine Reihe von Dateien als

zu löschen
rm -f -- "[email protected]"

wobei "[email protected]" ist eine Liste von Pfadnamen, die leer sein können oder nicht, oder die Pfadnamen enthalten können, die nicht existieren.

(rm -f generiert dennoch eine Diagnosemeldung und beendet sich mit einem Nicht-Null-Beendigungsstatus, wenn es Berechtigungsprobleme gibt Verhindern, dass eine benannte Datei entfernt wird.)

Das Ausführen des Dienstprogramms ohne Options- oder Pfadnamen-Operanden ist jedoch ein Fehler:

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

Dasselbe gilt für GNU rm (Das Obige zeigt OpenBSD rm ) und andere Implementierungen desselben Dienstprogramms, aber die genaue Diagnosemeldung und der Exit-Status ungleich Null können unterschiedlich sein (unter Solaris ist der Wert beispielsweise 2 und unter macOS ist er 64).

Abschließend der GNU rm Handbuch ist möglicherweise nur etwas ungenau, da es stimmt, dass mit einigen Optionen (-f , was eine optionale Option ist), ist der Pfadname-Operand optional.

seit der Ausgabe 2016, nach Behebung dieses Fehlers, siehe vorherige Ausgabe als Referenz.
POSIX ist der Standard, der definiert, was ein Unix-System ist und wie es sich verhält. Dieser Standard wird von The Open Group herausgegeben. Siehe auch die Frage "Was genau ist POSIX?".


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

rm --help
rm --version

(bei Verwendung von GNU rm ). Alle anderen Fälle erfordern einen Dateinamen.

Andere Versionen von rm zeigt die Datei als nicht optional an, z.B. in der OpenBSD-Manpage.

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

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


Linux
  1. Warum enthält die Bash-Übersetzungsdatei nicht alle Fehlertexte?

  2. Der Befehl „java“ führt die installierte JVM nicht aus

  3. Warum wird diese Shell-Pipeline beendet?

  4. Warum erkennt Windows keine Dateien in Linux-Partitionen?

  5. Warum kann ich diese Datei nicht als root löschen?

gdb trifft keine Breakpoints, wenn ich es aus dem Docker-Container heraus starte

Warum heißt es:Wir dürfen limit.h nicht einschließen! in dirent.h?

Warum verwendet rsync keine Delta-Übertragung für lokale Dateien?

Warum gibt mir das Wgeting eines Bildes eine Datei und kein Bild?

Warum funktioniert diese Regex nicht unter Linux?

Warum kann Wine 64-Bit-Programme unter Linux ausführen, aber nicht auf Mac?