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


28

아래 예제와 비슷한 것을 수행하는 표준 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 명령이 있기를 바랍니다.


10
exit내가 유일하게 생각할 수는 있지만 껍질을 끝내는 경향이 있습니다. bash -c 'exit 56'또는 bash -c "exit $1"당신을 위해 일할 수도 있습니다.
팀 케네디

12
어때요 (exit 56)?
cuonglm

6
이것은 XYProblem 처럼 들립니다 . 이것의 궁극적 인 목표는 무엇입니까? 주어진 번호를 종료 코드로 반환하는 명령이 필요한 이유는 무엇입니까?
Olivier Dulac

1
글쎄, 당신은이 truefalse당신이 0 또는 1을 반환해야하는 경우 빌트인
gardenhead

1
관련 : 컴파일 타임 고정 값을 반환하는 (휴대용이 아닌) 가장 작은 프로그램 : muppetlabs.com/~breadbox/software/tiny/teensy.html
Florian Castellane

답변:


39
  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}

좋은 생각이야 불행히도, 원래의 질문은 충분히 정의되지 않았습니다. "다른 쉘을 열고 닫을"필요는 거의 내가 원하는 일의 요구 사항이었습니다. <some cmd>execve () 가능 항목 을 요구하도록 내 질문을 편집했습니다 .
Chris

2
@Chris : 어떤 쉘 명령이라도 다음과 같이 변환하여 execve ()를 가능하게 만들 수 있습니다./bin/sh -c ...originalcommand...
psmears

3
? = 56이 작동하지 않는다는 데 약간 실망했습니다.
Joshua

@Joshua : 아마도 그렇습니까? 그러나이 애정은 성공적이었고 당신은 $? 0 ...;)으로 설정
Olivier Dulac

@OlivierDulac : 그렇지 않습니다. 구문 분석 오류가 발생합니다.
Joshua

17

특정 값만 반환하는 표준 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
true하고 false있는 유닉스 (심지어는 POSIX)에서뿐만 아니라,뿐만 아니라 GNU한다.
Stéphane Chazelas

@ StéphaneChazelas 지적 해 주셔서 감사합니다. OP가 bash를 언급했듯이 질문 자체에 'Unix'가 있지만 GNU를 가정했습니다.
tmh

14

실행 된 명령으로 종료 상태를 설정해야하는 경우 해당 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 은 그렇게하는 표준 명령이지만 쉘 특수 내장 이므로 일반 내장과 같이 파일 시스템에 해당 이름의 명령이 필요하지 않으며 대부분의 시스템에는 하나가 포함되지 않습니다


3
/* 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


반 관련 메모에서 : 1) affirmer로서 자신의 이름을 지정하지 않고 CC0 라이센스를 적용 아마 좋은 생각이 아니다, 당신이 그것을 어떻게해야 같이 , 2) 프로그램이 작고 저작권 중요하기에 너무 사소한, 당신 때문에 라이센스를 생략 할 수도 있습니다.
Rhymoid

2
(1)을 (를) argv[argc-1]대신 사용하고 왜을 (를) 불만족하지 않는지 이해 argv[1]가되지 않습니다 argc>2. (2) argv[1]테스트 전에 테스트 를 수행하는 경향이 argv[0]있어 사용자가 true 56또는 false 56대신 말할 수 returncode 56있습니다. argv[0]단어 argc>0가 혼동스럽고 혼란 스러울 수 있는 메시지 는 제공하지 않습니다 . (3) 사용자 친근감에 집착하므로 strcasecmp대신을 사용 합니다 strcmp. (4) 매개 변수를 확인하는 경향이 있으며 확인 atoi하지 않고 반환 값을 사용하지 않습니다 . 이와 같은 2 ¢ 프로그램의 경우 문제가되지 않습니다.
G-Man, 'Reinstate

@ G-Man 리눅스 시스템에서 인수를 처리 true하거나 false처리 하지 않음
ThePiercingPrince

네, 맞습니다. 그들은 argv[0];을 포함하여 어떤 인수도 처리하지 않습니다 . 프로그램 /bin/true/bin/false하드 코딩 된 종료 코드와 다른 실행 파일입니다. 당신 은 영리 하고 (연결된) 둘 다로 설치 될 수있는 프로그램을 작성했습니다 . 그러나 질문은 사용자 지정 종료 상태를 얻는 방법을 묻습니다. 프로그램은 다른 파일 이름으로 설치된 경우에만 해당 질문에 대답합니다. 어쨌든 당신이보고있는 한 , 나는 그것을 제안하는 방식으로하는 것이 세 번째 링크의 필요성을 피함으로써 영리의 수준을 유지할 것이라고 믿습니다. truefalseargv
G-남자 '는 분석 재개 모니카'말한다

0

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

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

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

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


4
$(exit 42)exit 42거의 이해가되지 않는 간단한 명령으로 출력을 실행하려고합니다 (또한 작동하지 않습니다 yash). (exit 42)(또한 exit서브 쉘에서 실행 되지만 출력 만 남겨둔다) 더 의미가 있고 이식성이 뛰어나다 (csh 나 Bourne 쉘까지).
Stéphane Chazelas
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.