códigos de retorno rm -rf

8

Qualquer um pode me informar os possíveis códigos de retorno para o comando rm -rf diferente de zero, isto é, possíveis códigos de retorno para casos de falha. Eu quero saber mais detalhada razão para a falha do comando ao contrário apenas o comando é falhado (retorno diferente de 0).


fonte
3
@ ØHankyPankyØ Eu estou realmente surpreso que a página do manual rm não descreve os possíveis códigos de status de saída. Se vocês man ls no Ubuntu, explica a razão para o status de saída diferente de zero
SheetJS
É um valor maior que 0. Em caso de erro.
Arun
4
Não concordo com a migração do SO, uma vez que o OP está interessado nos códigos de retorno, é muito provável que este seja um tipo de problema de script / programação.
Adrian Frühwirth
a propósito, eu estou interessado no número de cenários que ele pode retornar. Será dependente do sistema operacional?
meio chateado com a migração eu mesmo ... quase consegui a conquista de reversão = P
Matt Joyce

Respostas:

8

Para ver o código de retorno, você pode usar echo $? no bash.

Para ver o significado real, algumas plataformas (como o Debian Linux) perror binário disponível, que pode ser usado da seguinte forma:

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

rm -rf suprime automaticamente a maioria dos erros. O erro mais provável que você verá é 1 (Operação não permitida), o que acontecerá se você não tiver permissões para remover o arquivo. -f intencionalmente suprime a maioria dos erros

SheetJS
fonte
3
+1 para mencionar perror. No meu sistema ele vem com o mysql.
Adrian Frühwirth
pode ter melhor sorte com strace em termos de diagnósticos.
Matt Joyce
@MattJoyce strace informa se uma chamada de sistema falha, mas a menos que você olhe para a fonte, você não sabe como o syscall está relacionado ao status de saída do programa (por exemplo, se você executar em -f, ENOENT é suprimido). Portanto, isso não é relevante aqui
SheetJS
1
@MattJoyce há uma diferença entre o syscall falhando e o programa relatando um erro, e a pergunta é sobre o status de saída do programa.
SheetJS
1
Verdade. Lembre-se que você está olhando para a fonte de rm ... realmente não há muita coisa acontecendo lá.
Matt Joyce
2

peguei coreutils do git ....

olhando para a saída, 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);

Agora, olhando para a variável de status ....

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 não há muita coisa acontecendo com o status de saída.

Eu vejo EXIT_FAILURE e EXIT_SUCCESS e não qualquer outra coisa.

então basicamente 0 e 1 / -1

Para ver syscalls de saída específicos () e como eles ocorrem em um fluxo de processo, tente

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

relativamente simples.

ref:

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

Matt Joyce
fonte
Não entendo porque, +1 de mim. POSIX também só diz realmente 0 / >0.
Adrian Frühwirth
2
Embora isso possa ser parcialmente correto, ele não responde à pergunta do OP I want to know more detailed reason for the failure of the command unlike just the command is failed(return other than 0) então os votos abaixo são compreensíveis.
Prix
1
@ AdrianFrühwirth EXIT_FAILURE é 1: "Nos sistemas POSIX, o valor desta macro é 1" ( gnu.org/software/libc/manual/html_node/Exit-Status.html )
SheetJS
Adrian o ref de EXIT_FAILURE está lá e até mesmo o linux manpage para ele sugere que pode ser diferente em outras plataformas. Então eu pensei em sugerir isso também.
Matt Joyce
1
as mensagens de falha que você está procurando estão no código do arquivo de remoção real ... para o busybox você pode corrigir git.busybox.net/busybox/tree/libbb/remove_file.c ... para cada if (!(flags & FILEUTILS_FORCE)) { adicione um else{printf("same error message as perror");} Tenho certeza de que outras implementações seriam semelhantes, mas se não a versão do busybox poderia ser construída por conta própria e incluída.
technosaurus