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).


la source
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

SheetJS
la source
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/

Matt Joyce
la source
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