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
exit
bash에 내장되어 있으므로 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