종료 명령의 종료 코드 캡처


10

나는 이것을 bash 스크립트에 가지고있다 :

exit 3;

exit_code="$?"

if [[ "$exit_code" != "0" ]]; then
    echo -e "${r2g_magenta}Your r2g process is exiting with code $exit_code.${r2g_no_color}";
    exit "$exit_code";
fi

exit 명령 바로 다음에 종료되는 것처럼 보입니다. 즉시 종료하지 않고 종료 코드를 제공 할 수있는 간단한 명령이 있는지 궁금합니다.

나는 추측하려고했다 :

exec exit 3

그러나 오류 메시지가 나타 exec: exit: not found납니다.. 어떡해? :)


1
그래 exec exit 3더 부에노 없다, 내가 얻을"exec: exit: not found"

7
질문을 이해하지 못합니다. 왜 라인을 모두 설정 exit_code=3하고 제거 하지 exit 3않습니까?
wjandrea

@wjandrea은 실제보다 더 개념적인 질문입니다

2
여전히 이해가되지 않습니다. 실제로 종료하지 않으면 종료 코드가있는 이유는 무엇입니까?
Barmar

1
@Barmar 모든 프로세스에는 종료 코드가 있습니다. 질문에 대답하려는 대부분의 사람들은 질문을 "스크립트에서 'exit 3'을 무엇으로 대체하여 $?변수를 설정 하지만 스크립트를 종료하지 못 합니까? "를 의미하는 것으로 해석하고 있습니까?
이카루스

답변:


32

당신은 프로그램의 종료 상태 (과에서 일부 프로그램과 외모를 실행하는 스크립트가있는 경우  $?), 당신은 스크립트를 수행하여 것을 테스트 할 뭔가 원인이 있다고 $?알려진 몇 가지 값으로 설정하기를 (예를 들어,  3), 단지 할

(exit 3)

괄호는 하위 셸을 만듭니다. 그런 다음 exit명령은 해당 하위 쉘이 지정된 종료 상태로 종료되도록합니다.


또한 디버깅 목적으로 exit_code="3"테스트 를 위해 설정 하는 것만 큼 ​​간단합니다.
Centimane


12

exitbash 내장 기능이므로 사용할 수 없습니다 exec. 당 bash는 설명서 :

Bash의 종료 상태는 스크립트에서 마지막으로 실행 된 명령의 종료 상태입니다. 명령이 실행되지 않으면 종료 상태는 0입니다.

이 모든 것을 종합하면 원하는 종료 상태를 변수에 저장 한 다음 exit $MY_EXIT_STATUS적절한 경우 저장하는 것이 유일한 옵션이라고 말할 수 있습니다 .


@ G-man의 아이디어에 대해 어떻게 생각하십니까?

2
어쩌면 나는 당신이 성취하려는 것을 오해했을 것입니다. 당신이 방금 설정하려고하는 경우 $?(왜 그런지 잘 모르겠지만), 그것은 확실한 대답처럼 보입니다. 실패한 값으로 설정하려면 false다른 옵션이 있습니다.
solarshado

10

인수로 주어진 상태 또는 주어진 상태 255가 아닌 경우 상태를 반환하는 함수를 작성할 수 있습니다 . ( ret값을 "반환"할 때 호출합니다 .)

ret() { return "${1:-255}"; }

ret전화하는 대신 사용 하십시오 exit. 이것은 현재 허용되는 답변에서 하위 셸을 만드는 비 효율성을 피합니다.

일부 측정.

time bash -c 'for i in {1..10000} ; do (exit 3) ; done ; echo $?'

내 컴퓨터에서 약 3.5 초가 걸립니다.

 time bash -c 'ret(){ return $1 ; } ; for i in {1..10000} ; do ret 3 ; done ; echo $?'

내 컴퓨터에서 약 0.051 초가 걸리고 70 배 빠릅니다. 기본 처리를 사용하면 여전히 60 배 더 빠릅니다. 분명히 루프에는 약간의 오버 헤드가 있습니다. 루프 본문을 그대로 :또는 true시간을 0.025로 절반으로 변경하면 완전히 빈 루프가 유효하지 않은 구문입니다. ;:루프에 추가하면 이 최소 명령에 0.007 초가 걸리므로 루프 오버 헤드는 약 0.018입니다. 두 테스트에서이 오버 헤드를 빼면 ret솔루션이 100 배 이상 빠릅니다.

분명히 이것은 합성 측정이지만 일이 더해집니다. 필요한 것보다 모든 것을 100 배 느리게하면 시스템 속도가 느려집니다. 0.0


2
@iBug 추가 공간이 필요하지 않습니다.
이카루스

서브 쉘 작성의 비 효율성에 대한 좋은 지적. 필자는 일부 쉘이 이와 같은 경우 포크를 최적화하기에 충분히 똑똑 할 수 있지만 bash는 그중 하나가 아니라는 것을 읽었습니다.
G-남자 '는 분석 재개 모니카'말한다

3

에 대해 exec exit 3...라는 외부 명령을 실행하려고 시도 exit하지만 명령 이 없으므로 오류가 발생합니다. 쉘을 완전히 exec 대체 하기 때문에 쉘에 내장 된 명령 대신 외부 명령이어야합니다 . 또한 어떤 당신이라는 외부 명령 한 경우에도 수단 exit, exec exit 3이후, 쉘 스크립트를 계속 반환하지 것 쉘이 더 이상 없을 것을 .


1
나는 당신이 할 exec bash -c "exit 3"수 있다고 생각하지만, 지금은 그저 그 반대의 이유를 생각할 수 없습니다 exit 3.
David Z

1
@DavidZ는 어쨌든 exec'ing 또는 just'ing exit은 스크립트를 중지시킬 것입니다. 이것은 질문이 원하는 것처럼 보이지 않습니다.
ilkkachu

3

Awk 로이 작업을 수행 할 수 있습니다.

awk 'BEGIN{exit 9}'

또는 Sed :

sed Q9 /proc/stat

... 또는 껍질 :sh -c 'exit 9'
ilkkachu

1
@ilkkachu 당신이 그렇게 할 경우 당신은뿐만 아니라 (exit 9)받아 들여진 대답에서
스티븐 페니
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.