종료 명령의 종료 코드를 캡처합니다.

종료 명령의 종료 코드를 캡처합니다.

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

명령을 종료한 후 즉시 종료되는 것처럼 보이는데, 이는 의미가 있습니다. 즉시 종료하지 않고 종료 코드를 제공할 수 있는 간단한 명령이 있는지 궁금합니다.

나는 원래 추측하고 싶었습니다.

exec exit 3

하지만 오류 메시지가 표시됩니다: exec: exit: not found. 어떡해? :)

답변1

프로그램을 실행하고 프로그램의 종료 상태(with)를 확인하는 스크립트가 있고  $?다음을 수행하여 스크립트를 테스트하려는 경우무엇간단히 실행하면 $?알려진 값(예: )으로 설정  됩니다.3

(exit 3)

괄호는 서브쉘을 생성합니다. 그런 다음 이 exit명령을 사용하면 서브쉘이 지정된 종료 상태로 종료됩니다.

답변2

exitbash에 내장되어 있으므로 exec그렇게 할 수 없습니다. 모든배쉬 매뉴얼:

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

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

답변3

인수로 제공된 상태를 반환하거나 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배 더 빨라집니다. 분명히 루프에는 약간의 오버헤드가 있습니다. 루프 본문을 다음으로 변경하거나 시간을 0.025로 절반으로 줄이면 :완전히 true비어 있는 루프는 잘못된 구문입니다. ;:루프에 추가하면 이 최소 명령에 0.007초가 걸리므로 루프 오버헤드는 약 0.018입니다. 두 테스트에서 이 오버헤드를 빼면 이 ret솔루션이 100배 이상 빠르다는 것을 알 수 있습니다.

분명히 이것은 결합된 측정이지만 상황이 합산됩니다. 모든 것을 필요한 것보다 100배 느리게 만들면 시스템이 느려지게 됩니다. 0.0

답변4

awk를 사용하여 이 작업을 수행할 수 있습니다.

awk 'BEGIN{exit 9}'

또는 Sed:

sed Q9 /proc/stat

관련 정보