[unix] 특정 리턴 코드를 즉시 리턴하는 유닉스 명령?

아래 예제와 비슷한 것을 수행하는 표준 Unix 명령이 있습니까?

$ <cmd here> 56
$ echo Return code was $?
Return code was 56
$

<cmd here>포크로 실행될 수 있고 프로세스가 종료 될 때 종료 코드로 56을 남겨 둘 수 있어야합니다. exitreturn쉘 내장 명령은 내가 그것을 밖으로 종료에 의해 그들이 호출 쉘 자체에 영향을주기 때문에 무엇을 찾고 있어요에 부적합하다. <some cmd>쉘이 아닌 컨텍스트에서 실행할 수있는 것이어야합니다 (예 :을 사용하여 Python 스크립트에서 호출) subprocess.

예를 들어 /usr/bin/false항상 반환 코드 1을 사용하여 즉시 종료되지만 해당 반환 코드가 무엇인지 정확하게 제어하고 싶습니다. 자체 래퍼 스크립트를 작성하여 동일한 결과를 얻을 수 있습니다

$ cat my-wrapper-script.sh # i.e., <some cmd> = ./my-wrapper-script.sh
#!/usr/bin/bash
exit $1
$ ./my-wrapper-script.sh 56
$ echo $?
56

하지만이 작업을 수행 할 수있는 표준 Unix 명령이 있기를 바랍니다.



답변

  1. return기반 기능이 작동하고, (당 열 필요와 가까운 또 다른 쉘을 피할 것 팀 케네디 의 코멘트 ) :

    freturn() { return "$1" ; }
    freturn 56 ; echo $?

    산출:

    56
  2. exit서브 쉘에서 사용 하기 :

    (exit 56)

    이외의 쉘을 사용하면 ksh93추가 프로세스를 분기하므로 위의 것보다 효율성이 떨어집니다.

  3. bash/ zsh/ ksh93단지 트릭 :

    . <( echo return 56 )

    (이는 추가 프로세스 (및 파이프가있는 IPC)를 의미합니다).

  4. zsh의 람다 함수 :

    (){return 56}

답변

특정 값만 반환하는 표준 UNIX 명령은 없습니다. 는 GNU 핵심 Utilies을 제공 true하고 false단지.

그러나 다음과 같이 쉽게 직접 구현할 수 있습니다 ret.

#include <stdlib.h>
int main(int argc, char *argv[]) {
  return argc > 1 ? atoi(argv[1]) : 0;
}

엮다:

cc ret.c -o ret

그리고 다음을 실행하십시오.

./ret 56 ; echo $?

인쇄물:

56

추가 도구를 설치하지 않고 어디에서나 bash를 사용할 수 있어야하는 경우 주석에서 제안 된 @TimKennedy와 같이 다음 명령을 사용해야합니다.

bash -c 'exit 56'

참고 것을 반환 값의 유효 범위는 0..255 포함입니다 .


답변

실행 된 명령으로 종료 상태를 설정해야하는 경우 해당 1 전용 명령은 없지만 임의 종료 상태로 종료 할 수있는 언어의 인터프리터를 사용할 수 있습니다. sh가장 명백한 것입니다 :

sh -c 'exit 56'

대부분의 sh구현에서 종료 코드는 0에서 255까지로 제한됩니다 ( sh더 큰 값을 허용하지만 값을 자르거나 sh코드 257에서 320의 경우 ksh93과 같이 실행중인 프로세스로 신호가 전송 될 수 있음 ).

종료 코드는 정수 ( int) 값이 될 수 있지만 waitid()인터페이스 를 사용하여 검색해야 하므로 값이 8 비트로 잘리지 않습니다 (Linux에서는 여전히 잘립니다 waitid()). 따라서 종료 코드를 255 이상으로 사용하는 것이 드문 (그리고 좋은 아이디어는 아님) 이유는 무엇입니까 (정상 작동에는 0-123 사용).

또는

awk 'BEGIN{exit 56}'
perl -e 'exit 56'
python -c 'exit(56)'
expect -c 'exit 56'

(종료 코드를 8 비트로 자르지 마십시오).

NetBSD find를 사용하면 다음을 수행 할 수 있습니다.

find / -exit 56

1exit 은 그렇게하는 표준 명령이지만 쉘 특수 내장 이므로 일반 내장과 같이 파일 시스템에 해당 이름의 명령이 필요하지 않으며 대부분의 시스템에는 하나가 포함되지 않습니다


답변

/* Public domain, http://creativecommons.org/publicdomain/zero/1.0/ */
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(int argc,char **argv) {
    if(!strcasecmp(argv[0],"true")) return 0;
    else if (!strcasecmp(argv[0],"false")) return 1;
    else if(argc<2) {fputs("One argument required\n",stderr);return 1;}
    else if(!strcasecmp(argv[argc-1],"true")) return 0;
    else if(!strcasecmp(argv[argc-1],"false")) return 1;
    else return atoi(argv[argc-1]);
}

이것을 파일 이름으로 저장 returncode.c하고gcc -o returncode returncode.c


답변

exit명령에 대한 유일한 문제가 현재 쉘에서 나가는 것이 확실하지 않은지 확실하지 않은 경우 하위 쉘이 작동 할 수 있습니다.

username@host$ $(exit 42)
username@host$ echo $?
42

방금 Cygwin Bash에서 이것을 테스트했으며 저에게 효과적입니다.

편집 : 죄송합니다. 쉘 컨텍스트 외부에서 실행하는 부분을 놓쳤습니다. 이 경우 .sh스크립트 내에서 랩핑하고 환경에서 실행 하지 않으면 도움이되지 않습니다 .


답변