아래 예와 비슷한 작업을 수행할 수 있는 표준 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
기능 기반으로
return
작동하며 다른 쉘을 열고 닫을 필요가 없습니다(다음에 따르면).팀 케네디의 코멘트):freturn() { return "$1" ; } freturn 56 ; echo $?
산출:
56
exit
서브쉘에서 사용:(exit 56)
이외의 쉘의 경우
ksh93
이는 추가 프로세스를 분기하는 것을 의미하므로 위 프로세스보다 효율성이 떨어집니다.bash
//유일한zsh
트릭ksh93
:. <( echo return 56 )
(이것은 또한 추가 프로세스(및 파이프가 있는 IPC)를 의미합니다).
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
하고 환경에서 실행하지 않으면 도움이 되지 않습니다.