rm -rf 리턴 코드


9

어느 누구도 제로 이외 의 명령 rm -rf에 대한 가능한 리턴 코드를 알려줄 수 있습니다. 즉, 실패 사례에 대한 가능한 리턴 코드. 명령이 실패하는 것과 달리 명령이 실패하는 더 자세한 이유를 알고 싶습니다 (0 이외의 반환).

shell  unix 

3
@ ØHankyPankyØ 실제로 rm 맨 페이지가 가능한 종료 상태 코드를 설명하지 않는다는 것이 놀랍습니다. man lsUbuntu를 사용하는 경우 0이 아닌 종료 상태의 이유를 설명합니다.
SheetJS

0보다 큰 값입니다. 오류가 발생한 경우.
Arun

6
나는 OP가 리턴 코드에 관심이 있기 때문에 SO에서 마이그레이션하는 것에 동의하지 않습니다. 이는 스크립팅 / 프로그래밍 종류의 문제 일 가능성이 큽니다.
Adrian Frühwirth

그건 그렇고, 나는 그것이 반환 할 수있는 시나리오의 수에 관심이 있습니다. OS에 따라 다릅니 까?

좀 마이그레이션에 대해 화가 났어요 ... 거의 반전 성과를 얻었다 = P
Matt Joyce

답변:


8

리턴 코드를 보려면 echo $?bash에서 사용할 수 있습니다 .

실제 의미를 확인하기 위해 Debian Linux와 같은 일부 플랫폼에는 perror바이너리가 있으며 다음과 같이 사용할 수 있습니다.

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

rm -rf대부분의 오류를 자동으로 억제합니다. 가장 많이 발생하는 오류는 1(작업이 허용되지 않음)이며, 파일을 제거 할 권한이없는 경우에 발생합니다. -f의도적으로 대부분의 오류를 억제


3
언급 +1 perror. 내 시스템에서는 mysql과 함께 제공됩니다.
Adrian Frühwirth

진단 측면에서 strace를 사용하는 것이 좋습니다.
Matt Joyce

@MattJoyce는 strace시스템 호출이 실패 할 경우를 알 수 있지만 소스를 보면 않는 한 당신은 콜이 (당신이 실행하는 경우, 예를 들어, 프로그램 종료 상태에 어떻게 관련되는지 모른다 -f, ENOENT억제). 따라서 여기에는 관련이 없습니다
SheetJS

1
@MattJoyce는 syscall 실패와 오류를보고하는 프로그램간에 차이가 있으며 프로그램 종료 상태에 대한 질문입니다.
SheetJS

1
진실. 당신은 rm의 소스를보고 마음에 ... 정말 거기에 많은 일이 없습니다.
Matt Joyce

2

자식에서 coreutils를 잡았습니다 ....

출구를 보면 ...

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

이제 상태 변수를보고 있습니다 ....

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

종료 상태로 진행되지 않는 것 같습니다.

EXIT_FAILURE 및 EXIT_SUCCESS가 보이지만 다른 것은 없습니다.

기본적으로 0과 1 / -1

특정 exit () syscall과 프로세스 흐름에서 발생하는 방식을 보려면 다음을 시도하십시오.

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

상당히 간단합니다.

심판 :

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


왜 그런지 이해하지 못합니다. +1 POSIX 는 또한 실제로 말합니다 0 / >0.
Adrian Frühwirth

2
이것은 부분적으로 옳을 수도 있지만 OP 질문에 대답하지 않으므로 I want to know more detailed reason for the failure of the command unlike just the command is failed(return other than 0)하향 투표를 이해할 수 있습니다.
Prix

1
@ AdrianFrühwirth EXIT_FAILURE는 1입니다 : "POSIX 시스템에서이 매크로의 값은 1입니다"( gnu.org/software/libc/manual/html_node/Exit-Status.html )
SheetJS

EXIT_FAILURE의 애드리안 심판이 있으며 리눅스 맨 페이지에서도 다른 플랫폼과 다를 수 있다고 제안합니다. 그래서 나는 그것을 제안 할 것이라고 생각했습니다.
Matt Joyce

1
찾고있는 실패 메시지는 실제 제거 파일 코드에 있습니다 ... busybox의 경우 git.busybox.net/busybox/tree/libbb/remove_file.c를 패치 할 수 있습니다 ... 각 if (!(flags & FILEUTILS_FORCE)) {추가 마다 else{printf("same error message as perror");}다른 구현이 확실합니다. 비슷하지만 busybox 버전은 자체 빌드 및 포함 될 수 있습니다.
technosaurus
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.