GNU/Linux >> Tutoriels Linux >  >> Linux

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

Le synopsis standard pour le rm L'utilitaire est spécifié dans la norme POSIX comme

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

Dans sa première forme, il nécessite au moins un opérande de fichier, mais pas dans sa seconde forme.

Faire rm -f sans opérandes 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 option, le rm l'utilitaire devrait...

Ne demande pas de confirmation. N'écrivez pas de messages de diagnostic et ne modifiez pas l'état de sortie en cas d'absence d'opérandes de fichier ou d'opérandes qui n'existent pas. Toutes les occurrences précédentes du -i l'option doit être ignorée.

Cela confirme qu'il doit être possible d'exécuter rm -f sans aucun opérande de nom de chemin et que ce n'est pas quelque chose qui fait rm sortie 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 comme

rm -f -- "[email protected]"

"[email protected]" est une liste de chemins qui peuvent être vides ou non, ou qui peuvent contenir des chemins 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 y a des problèmes d'autorisation empêcher la suppression d'un fichier nommé.)

L'exécution de l'utilitaire sans opérandes d'option ni de nom de chemin est cependant une erreur :

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

Il en va de même pour GNU rm (ce qui précède montre OpenBSD rm ) et d'autres implémentations du même utilitaire, mais le message de diagnostic exact et l'état de sortie différent de zéro peuvent être différents (sur Solaris, la valeur est 2, et sur macOS, c'est 64, par exemple).

En conclusion, la GNU rm le manuel est peut-être juste un peu imprécis car c'est vrai qu'avec certaines option (-f , qui est une option facultative), l'opérande du nom de chemin est facultatif.

depuis l'édition 2016, après résolution de ce bug, voir l'édition précédente pour référence.
POSIX 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 ?".


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.

Autres versions de rm afficher le fichier comme non facultatif, par exemple dans la page de manuel OpenBSD.

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

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


Linux
  1. Pourquoi ne puis-je pas diviser un fichier .ape ?

  2. Impossible d'exécuter la commande de configuration :"aucun fichier ou répertoire de ce type" ?

  3. Pourquoi "zip" dans une boucle For fonctionne-t-il lorsque le fichier existe, mais pas lorsqu'il n'existe pas ?

  4. Pourquoi `exit &` ne fonctionne pas ?

  5. La commande "java" n'exécute pas la JVM qui a été installée

Pourquoi le fichier de traduction Bash ne contient-il pas tous les textes d'erreur ?

Sous Unix, puis-je exécuter "make" dans un répertoire sans d'abord accéder à ce répertoire ?

read(2) peut-il renvoyer zéro lorsqu'il n'est pas à EOF ?

Pourquoi stdout a-t-il besoin d'un vidage explicite lorsqu'il est redirigé vers un fichier ?

Pourquoi Windows ne reconnaît-il pas les fichiers à l'intérieur des partitions Linux ?

Pourquoi ne puis-je pas supprimer ce fichier en tant que root ?