rm -rf Rückkehrcodes

9

Jeder kann mir die möglichen Rückkehrcodes für den Befehl rm -rf außer Null mitteilen, dh mögliche Rückkehrcodes für Fehlerfälle. Ich möchte einen detaillierteren Grund für den Fehler des Befehls kennen, im Gegensatz dazu, dass nur der Befehl fehlgeschlagen ist (Rückgabe anders als 0).


quelle
3
@ ØHankyPankyØ Ich bin tatsächlich überrascht, dass die rm-Manpage die möglichen Exit-Statuscodes nicht beschreibt. Wenn Sie man lsauf Ubuntu sind, erklärt es den Grund für den Exit-Status ungleich Null
SheetJS
Es ist ein Wert größer als 0. Im Fehlerfall.
Arun
6
Ich bin mit der Migration von SO nicht einverstanden, da das OP an den Rückkehrcodes interessiert ist, ist es sehr wahrscheinlich, dass dies ein Problem mit Skripten / Programmierungen ist.
Adrian Frühwirth
Übrigens bin ich an der Anzahl der Szenarien interessiert, die es zurückgeben kann. Wird es vom Betriebssystem abhängig sein?
ein bisschen sauer über die Migration selbst ... hätte fast die Umkehrleistung erreicht = P
Matt Joyce

Antworten:

8

Um den Rückkehrcode anzuzeigen, können Sie echo $?in bash verwenden.

Um die tatsächliche Bedeutung zu erkennen, verfügen einige Plattformen (wie Debian Linux) über die perrorBinärdatei, die wie folgt verwendet werden kann:

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

rm -rfUnterdrückt die meisten Fehler automatisch. Der wahrscheinlichste Fehler, den Sie sehen, ist 1(Vorgang nicht zulässig). Dies tritt auf, wenn Sie nicht über die Berechtigung zum Entfernen der Datei verfügen. -funterdrückt absichtlich die meisten Fehler

SheetJS
quelle
3
+1 für die Erwähnung perror. Auf meinem System wird es mit MySQL geliefert.
Adrian Frühwirth
Vielleicht haben Sie mehr Glück mit Strace in Bezug auf die Diagnose.
Matt Joyce
@MattJoyce straceteilt Ihnen mit, ob ein Systemaufruf fehlschlägt. Wenn Sie sich jedoch nicht die Quelle ansehen, wissen Sie nicht, wie sich der Systemaufruf auf den Programm-Exit-Status bezieht (z. B. wenn Sie ausgeführt werden -f, ENOENTwird er unterdrückt). Daher ist das hier nicht relevant
SheetJS
1
@MattJoyce Es gibt einen Unterschied zwischen dem fehlgeschlagenen Systemaufruf und dem Programm, das einen Fehler meldet, und die Frage lautet nach dem Programm-Exit-Status.
SheetJS
1
Wahr. Wohlgemerkt, wenn Sie sich die Quelle für rm ansehen ... dort ist wirklich nicht viel los.
Matt Joyce
2

schnappte sich Coreutils von Git ....

Beim Blick auf den Ausgang sehen wir ...

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

Schauen wir uns nun die Statusvariable an ....

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

Es sieht so aus, als ob dort mit dem Exit-Status nicht viel los ist.

Ich sehe EXIT_FAILURE und EXIT_SUCCESS und sonst nichts.

also im Grunde 0 und 1 / -1

Versuchen Sie dies, um bestimmte exit () - Systemaufrufe und deren Auftreten in einem Prozessablauf anzuzeigen

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

ziemlich Einfach.

ref:

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

Matt Joyce
quelle
Verstehe nicht warum, +1 von mir. POSIX sagt auch nur wirklich 0 / >0.
Adrian Frühwirth
2
Dies mag teilweise richtig sein, beantwortet jedoch nicht die OP-Frage, I want to know more detailed reason for the failure of the command unlike just the command is failed(return other than 0)sodass die Abstimmungen verständlich sind.
Prix
1
@ AdrianFrühwirth EXIT_FAILURE ist 1: "Auf POSIX-Systemen ist der Wert dieses Makros 1" ( gnu.org/software/libc/manual/html_node/Exit-Status.html )
SheetJS
Adrian, der Ref für EXIT_FAILURE, ist da und sogar die Linux-Manpage dafür legt nahe, dass es auf anderen Plattformen anders sein kann. Also dachte ich mir, ich würde das auch vorschlagen.
Matt Joyce
1
die Fehlermeldungen , die Sie suchen sind in der eigentlichen Datei Code entfernen ... für Busybox Sie flicken könnte git.busybox.net/busybox/tree/libbb/remove_file.c ... für jeden if (!(flags & FILEUTILS_FORCE)) {addieren ein else{printf("same error message as perror");}Ich bin sicher , dass andere Implementierungen würde ähnlich sein, aber wenn nicht, könnte die Busybox-Version selbst erstellt und enthalten werden.
Technosaurus