códigos de retorno rm -rf

9

Cualquiera puede hacerme saber los posibles códigos de retorno para el comando rm -rf que no sea cero, es decir, posibles códigos de retorno para casos de falla. Quiero saber la razón más detallada del fallo del comando, a diferencia del fallo del comando (retorno distinto de 0).


fuente
3
@ ØHankyPankyØ Estoy realmente sorprendido de que la página de manual de rm no describa los posibles códigos de estado de salida. Si está man lsen Ubuntu, explica la razón del estado de salida distinto de cero
SheetJS
Es un valor mayor que 0. En caso de error.
Arun
66
No estoy de acuerdo con la migración desde SO, ya que el OP está interesado en los códigos de retorno, es muy probable que este sea un tipo de problema de programación / scripting.
Adrian Frühwirth
Por cierto, me interesa la cantidad de escenarios que puede devolver. ¿Será dependiente del sistema operativo?
un poco molesto por la migración yo mismo ... casi obtuve el logro de reversión = P
Matt Joyce

Respuestas:

8

Para ver el código de retorno, puede usar echo $?en bash.

Para ver el significado real, algunas plataformas (como Debian Linux) tienen el perrorbinario disponible, que puede usarse de la siguiente manera:

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

rm -rfsuprime automáticamente la mayoría de los errores. El error más probable que verá es 1(Operación no permitida), que ocurrirá si no tiene permisos para eliminar el archivo. -fsuprime intencionalmente la mayoría de los errores

SheetJS
fuente
3
+1 por mencionar perror. En mi sistema se envía con mysql.
Adrian Frühwirth
podría tener mejor suerte con strace en términos de diagnóstico.
Matt Joyce
@MattJoyce stracele dice si falla una llamada del sistema, pero a menos que mire la fuente, no sabe cómo se relaciona la llamada al sistema con el estado de salida del programa (por ejemplo, si se ejecuta -f, ENOENTse suprime). Por lo tanto, eso no es relevante aquí
SheetJS
1
@MattJoyce hay una diferencia entre la falla de syscall y el programa que informa un error, y la pregunta es acerca del estado de salida del programa.
SheetJS
1
Cierto. Eso sí, estás mirando la fuente de rm ... realmente no está sucediendo mucho allí.
Matt Joyce
2

agarró coreutils de git ...

mirando la salida vemos ...

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

Ahora mirando la variable de estado ...

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

Parece que no está sucediendo mucho allí con el estado de salida.

Veo EXIT_FAILURE y EXIT_SUCCESS y nada más.

así que básicamente 0 y 1 / -1

Para ver llamadas de salida específicas () y cómo se producen en un flujo de proceso, intente esto

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

bastante simple.

árbitro:

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

Matt Joyce
fuente
No entiendo por qué, +1 de mi parte. POSIX también solo realmente dice 0 / >0.
Adrian Frühwirth
2
Si bien esto puede ser parcialmente correcto, no responde la pregunta de OP, I want to know more detailed reason for the failure of the command unlike just the command is failed(return other than 0)por lo que los votos negativos son comprensibles.
Premio
1
@ AdrianFrühwirth EXIT_FAILURE es 1: "En los sistemas POSIX, el valor de esta macro es 1" ( gnu.org/software/libc/manual/html_node/Exit-Status.html )
SheetJS
Adrian, la referencia de EXIT_FAILURE está allí e incluso la página de manual de Linux sugiere que puede ser diferente en otras plataformas. así que pensé que sugeriría eso también.
Matt Joyce
1
los mensajes de falla que está buscando están en el código de eliminación de archivo real ... para busybox, puede parchear git.busybox.net/busybox/tree/libbb/remove_file.c ... para cada if (!(flags & FILEUTILS_FORCE)) {agregar else{printf("same error message as perror");}y estoy seguro de que otras implementaciones ser similar, pero si no, la versión de busybox podría construirse por sí sola e incluirse.
technosaurus