web-dev-qa-db-fra.com

Pourquoi rm manual dit que nous pouvons l'exécuter sans aucun argument, alors que ce n'est pas vrai?

Nous pouvons voir que le synopsis de la commande rm est:

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

Cela ne signifie-t-il pas que nous pouvons utiliser uniquement la commande rm sans aucune option ni argument?
Lorsque j'exécute la commande rm seule, le terminal affiche alors l'erreur suivante:

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

Quelqu'un peut-il me dire pourquoi c'est le cas?

24

Le synopsis standard pour l'utilitaire rm est spécifié dans la norme POSIX1 & 2 comme

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

Dans sa première forme, il nécessite au moins un opérande de fichier, mais dans sa deuxième forme, il ne le fait pas.

Faire rm -f sans opérande de fichier n'est pas une erreur:

$ rm -f
$ echo "$?"
0

... mais ça ne fait pas grand-chose.

La norme dit que pour le -f, l'utilitaire rm devrait ...

Ne pas demander de confirmation. N'écrivez pas de messages de diagnostic et ne modifiez pas l'état de sortie dans le cas où il n'y a pas d'opérandes de fichier ou dans le cas d'opérandes qui n'existent pas. Toutes les occurrences précédentes de -i l'option doit être ignorée.

Cela confirme qu'il doit être possible d'exécuter rm -f sans opérande de nom de chemin et que ce n'est pas quelque chose qui fait sortir rm avec un message de diagnostic ni un état de sortie différent de zéro.

Ce fait est très utile dans un script qui essaie de supprimer un certain nombre de fichiers

rm -f -- "$@"

"$@" est une liste de chemins d'accès qui peuvent être vides ou non, ou qui peuvent contenir des chemins d'accès qui n'existent pas.

(rm -f générera toujours un message de diagnostic et quittera avec un état de sortie différent de zéro s'il existe des problèmes d'autorisation empêchant la suppression d'un fichier nommé.)

L'exécution de l'utilitaire sans option ni opérande de chemin d'accès est une erreur cependant:

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

Il en va de même pour GNU rm (ci-dessus montre OpenBSD rm) et d'autres implémentations du même utilitaire, mais le message de diagnostic exact et le non l'état de sortie zéro peut être différent (sous Solaris, la valeur est 2 et sous macOS, c'est 64, par exemple).

En conclusion, le manuel GNU rm peut être un peu imprécis car il est vrai qu'avec certaines options (-f, qui est une option facultative), l'opérande de chemin d'accès est facultatif.


1depuis l'édition 2016, après résolution de ce bug , voir l'édition précédente pour référence.
2POSIX est la norme qui définit ce qu'est un système Unix et comment il se comporte. Cette norme est publiée par The Open Group . Voir aussi la question " Qu'est-ce que POSIX exactement? ".

45
Kusalananda

Techniquement, le synopsis est correct, mais il prête à confusion. Il y a des cas où aucun nom de fichier n'est nécessaire:

rm --help
rm --version

(lors de l'utilisation de GNU rm). Tous les autres cas nécessitent un nom de fichier.

D'autres versions de rm montrent le fichier comme non optionnel, par exemple dans la page de manuel OpenBSD .

Un synopsis plus précis pour GNU rm montrerait les trois variantes:

rm [ options ...] fichier . ..
rm --help
rm --version

9
Stephen Kitt