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.