아래 예제와 비슷한 것을 수행하는 표준 Unix 명령이 있습니까?
$ <cmd here> 56
$ echo Return code was $?
Return code was 56
$
<cmd here>
포크로 실행될 수 있고 프로세스가 종료 될 때 종료 코드로 56을 남겨 둘 수 있어야합니다. exit
와 return
쉘 내장 명령은 내가 그것을 밖으로 종료에 의해 그들이 호출 쉘 자체에 영향을주기 때문에 무엇을 찾고 있어요에 부적합하다. <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 명령이 있기를 바랍니다.
답변
-
return
기반 기능이 작동하고, (당 열 필요와 가까운 또 다른 쉘을 피할 것 팀 케네디 의 코멘트 ) :freturn() { return "$1" ; } freturn 56 ; echo $?
산출:
56
-
exit
서브 쉘에서 사용 하기 :(exit 56)
이외의 쉘을 사용하면
ksh93
추가 프로세스를 분기하므로 위의 것보다 효율성이 떨어집니다. -
bash
/zsh
/ksh93
단지 트릭 :. <( echo return 56 )
(이는 추가 프로세스 (및 파이프가있는 IPC)를 의미합니다).
-
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
스크립트 내에서 랩핑하고 환경에서 실행 하지 않으면 도움이되지 않습니다 .