특정 반환 코드를 즉시 반환하는 Unix 명령은 무엇입니까?

특정 반환 코드를 즉시 반환하는 Unix 명령은 무엇입니까?

아래 예와 비슷한 작업을 수행할 수 있는 표준 Unix 명령이 있습니까?

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

<cmd here>포크 실행이 가능하고 프로세스가 종료될 때 종료 코드로 56을 남겨둘 수 있어야 합니다. exit그리고 쉘 내장 기능은 return종료함으로써 호출 쉘 자체에 영향을 미치기 때문에 내가 찾고 있는 것에 적합하지 않습니다. <some cmd>쉘이 아닌 컨텍스트에서 실행할 수 있는 것이어야 합니다(예: 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

  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}
    

답변2

특정 값만 반환하는 표준 UNIX 명령은 없습니다. GNU 핵심 유틸리티에서만 제공 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(포함)입니다..

답변3

명령을 실행하여 종료 상태를 설정해야 하는 경우. 특별한 command1 없지만 임의의 종료 상태로 종료할 수 있는 모든 언어의 인터프리터를 사용할 수 있습니다. sh가장 분명한 것은 다음과 같습니다.

sh -c 'exit 56'

대부분의 sh구현에서 이는 종료 코드 0~255로 제한됩니다. sh더 큰 값이 허용되지만 잘릴 수도 있고 sh코드 257~320의 ksh93과 같이 실행 프로세스에 신호가 전송될 수도 있습니다.

종료 코드는 임의의 정수( ) 값일 수 있지만 값이 8비트로 잘리지 않도록 int인터페이스를 사용하여 검색해야 합니다 ( 그러나 Linux에서는 여전히 잘립니다). 따라서 255보다 높은 종료 코드를 사용하는 것이 드물고 좋은 생각이 아닌 이유는 무엇입니까(정상 작동에서는 0-123을 사용함).waitid()waitid()

또는:

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

(종료 코드를 8비트로 자르지 않습니다.)

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

find / -exit 56

1은exit 이 작업을 수행하는 표준 명령이지만 쉘로특수 내장, 일반 내장 명령처럼 파일 시스템에 해당 이름의 명령이 있을 필요가 없으며 대부분의 시스템에는 명령이 포함되지 않습니다.

답변4

이 명령의 유일한 문제가 exit현재 셸을 종료하는 것인지 확실하지 않지만 그렇다면 하위 셸이 작동할 수 있습니다.

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

방금 Cygwin Bash에서 이것을 테스트했는데 효과가 있었습니다.

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

관련 정보