rm -rf codici di ritorno


9

Chiunque può farmi sapere i possibili codici di ritorno per il comando rm -rf diverso da zero, cioè possibili codici di ritorno per casi di errore. Voglio sapere un motivo più dettagliato per il fallimento del comando a differenza del solo comando fallito (ritorno diverso da 0).

shell  unix 

3
@ ØHankyPankyØ In realtà sono sorpreso che la manpage rm non descriva i possibili codici di stato di uscita. Se sei man lssu Ubuntu, spiega il motivo dello stato di uscita
diverso

È un valore maggiore di 0. In caso di errore
Arun,

6
Non sono d'accordo con la migrazione da SO, poiché l'OP è interessato ai codici di ritorno è molto probabile che si tratti di un problema di scripting / programmazione.
Adrian Frühwirth,

a proposito, sono interessato al numero di scenari che può restituire. Dipenderà dal sistema operativo?

un po 'incazzato per la migrazione me stesso ... ho quasi ottenuto il risultato dell'inversione = P
Matt Joyce

Risposte:


8

Per vedere il codice di ritorno, puoi usare echo $?in bash.

Per vedere il significato reale, alcune piattaforme (come Debian Linux) hanno il perrorbinario disponibile, che può essere usato come segue:

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

rm -rfelimina automaticamente la maggior parte degli errori. L'errore più probabile che vedrai è 1(Operazione non consentita), che si verificherà se non disponi delle autorizzazioni per rimuovere il file. -felimina intenzionalmente la maggior parte degli errori


3
+1 per la menzione perror. Sul mio sistema viene fornito con mysql.
Adrian Frühwirth,

potrebbe avere più fortuna con lo strace in termini di diagnostica.
Matt Joyce,

@MattJoyce straceti dice se una chiamata di sistema fallisce, ma a meno che non guardi l'origine non sai come la syscall si collega allo stato di uscita del programma (ad esempio, se si esegue -f, ENOENTviene soppresso). Quindi non è rilevante qui
SheetJS

1
@MattJoyce c'è una differenza tra il fallimento di syscall e il programma che segnala un errore e la domanda è sullo stato di uscita del programma.
SheetJS,

1
Vero. Intendiamoci guardando la fonte per rm ... non c'è davvero molto da fare lì.
Matt Joyce,

2

afferrato coreutils da git ....

guardando l'uscita vediamo ...

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

Ora guardando la variabile di stato ....

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

sembra che non ci sia molto da fare lì con lo stato di uscita.

Vedo EXIT_FAILURE ed EXIT_SUCCESS e non altro.

quindi sostanzialmente 0 e 1 / -1

Per vedere syscalls exit () specifici e come si verificano in un flusso di processo, provare questo

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

abbastanza semplice.

ref:

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


Non capisco perché, +1 da me. POSIX dice anche davvero 0 / >0.
Adrian Frühwirth,

2
Sebbene ciò possa essere parzialmente corretto, non risponde alla domanda del PO, I want to know more detailed reason for the failure of the command unlike just the command is failed(return other than 0)quindi i voti negativi sono comprensibili.
Prix

1
@ AdrianFrühwirth EXIT_FAILURE è 1: "Sui sistemi POSIX, il valore di questa macro è 1" ( gnu.org/software/libc/manual/html_node/Exit-Status.html )
SheetJS

Adrian il riferimento per EXIT_FAILURE è lì e anche la manpage di Linux perché suggerisce che può essere diverso su altre piattaforme. quindi ho pensato di suggerire anche quello.
Matt Joyce,

1
i messaggi di errore che stai cercando sono nell'effettivo codice di rimozione del file ... per busybox potresti correggere git.busybox.net/busybox/tree/libbb/remove_file.c ... per ogni if (!(flags & FILEUTILS_FORCE)) {aggiunta else{printf("same error message as perror");}e sono sicuro che altre implementazioni sarebbero essere simile, ma in caso contrario la versione busybox potrebbe essere costruita da sola e inclusa.
technosaurus
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.