codes de retour rm -rf


9

N'importe qui peut me faire connaître les codes de retour possibles pour la commande rm -rf autres que zéro, c'est-à-dire les codes de retour possibles pour les cas de défaillance. Je veux connaître la raison plus détaillée de l'échec de la commande, contrairement à la commande qui a échoué (retour différent de 0).

shell  unix 

3
@ ØHankyPankyØ Je suis en fait surpris que la page de manuel rm ne décrive pas les codes d'état de sortie possibles. Si vous man ls
— utilisez

C'est une valeur supérieure à 0. En cas d'erreur.
— Arun

6
Je ne suis pas d'accord avec la migration depuis SO, car l'OP s'intéresse aux codes de retour, il est très probable que ce soit un problème de script / programmation.
— Adrian Frühwirth

par ailleurs, je suis intéressé par le nombre de scénarios qu'il peut retourner. Sera-t-il dépendant du système d'exploitation?

un peu énervé à propos de la migration moi-même ... j'ai presque réussi le renversement = P
— Matt Joyce

Réponses:


8

Pour voir le code retour, vous pouvez utiliser echo $?dans bash.

Pour voir la signification réelle, certaines plateformes (comme Debian Linux) ont le perrorbinaire disponible, qui peut être utilisé comme suit:

$ rm -rf something/; perror $?
rm: cannot remove `something/': Permission denied
OS error code   1:  Operation not permitted

rm -rfsupprime automatiquement la plupart des erreurs. L'erreur la plus probable que vous verrez est 1(Opération non autorisée), qui se produira si vous n'avez pas les autorisations pour supprimer le fichier. -fsupprime intentionnellement la plupart des erreurs


3
+1 pour mentionner perror. Sur mon système, il est livré avec mysql.
— Adrian Frühwirth

pourrait avoir plus de chance avec strace en termes de diagnostics.
— Matt Joyce

@MattJoyce stracevous indique si un appel système échoue, mais à moins que vous ne regardiez la source, vous ne savez pas comment le syscall est lié à l'état de sortie du programme (par exemple, si vous exécutez -f, ENOENTest supprimé). Par conséquent, ce n'est pas pertinent ici
— SheetJS

1
@MattJoyce, il y a une différence entre l'échec de l'appel système et le programme signalant une erreur, et la question porte sur l'état de sortie du programme.
— SheetJS

1
Vrai. Remarquez que vous cherchez la source de rm ... il ne se passe vraiment pas grand-chose.
— Matt Joyce du

2

attrapé coreutils de git ....

en regardant la sortie, nous voyons ...

openfly@linux-host:~/coreutils/src $ cat rm.c | grep -i exit
  if (status != EXIT_SUCCESS)
  exit (status);
  /* Since this program exits immediately after calling 'rm', rm need not
  atexit (close_stdin);
          usage (EXIT_FAILURE);
        exit (EXIT_SUCCESS);
          usage (EXIT_FAILURE);
        error (EXIT_FAILURE, errno, _("failed to get attributes of %s"),
        exit (EXIT_SUCCESS);
  exit (status == RM_ERROR ? EXIT_FAILURE : EXIT_SUCCESS);

Regardons maintenant la variable d'état ....

openfly@linux-host:~/coreutils/src $ cat rm.c | grep -i status
usage (int status)
  if (status != EXIT_SUCCESS)
  exit (status);
  enum RM_status status = rm (file, &x);
  assert (VALID_STATUS (status));
  exit (status == RM_ERROR ? EXIT_FAILURE : EXIT_SUCCESS);

on dirait qu'il n'y a pas grand-chose avec le statut de sortie.

Je vois EXIT_FAILURE et EXIT_SUCCESS et rien d'autre.

donc en gros 0 et 1 / -1

Pour voir des appels système exit () spécifiques et comment ils se produisent dans un flux de processus, essayez ceci

openfly@linux-host:~/ $ strace rm -rf $whatever 

assez simple.

réf:

http://www.unix.com/man-page/Linux/EXIT_FAILURE/exit/


Je ne comprends pas pourquoi, +1 de moi. POSIX dit aussi vraiment 0 / >0.
— Adrian Frühwirth

2
Bien que cela puisse être partiellement correct, cela ne répond pas à la question du PO, I want to know more detailed reason for the failure of the command unlike just the command is failed(return other than 0)donc les votes négatifs sont compréhensibles.
— Prix

1
@ AdrianFrühwirth EXIT_FAILURE est 1: "Sur les systèmes POSIX, la valeur de cette macro est 1" ( gnu.org/software/libc/manual/html_node/Exit-Status.html )
— SheetJS

Adrian la référence pour EXIT_FAILURE est là et même la page de manuel linux pour elle suggère qu'elle peut être différente sur d'autres plates-formes. donc je pensais que je suggérerais cela aussi.
— Matt Joyce

1
les messages d'échec que vous recherchez se trouvent dans le code de suppression réel du fichier ... pour busybox, vous pouvez corriger git.busybox.net/busybox/tree/libbb/remove_file.c ... pour chaque if (!(flags & FILEUTILS_FORCE)) {ajout, else{printf("same error message as perror");}je suis sûr que d'autres implémentations le feraient être similaire, mais sinon la version busybox pourrait être construite seule et incluse.
— technosaurus
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.