exec 명령의 반환 코드를 캡처하려고 하는데 일단 명령이 실행되면 다음 줄로 넘어가지 않고 스크립트가 종료됩니다.
exec /bin/sh -c $command > log.txt
rc=$?
if [ $rc -ne 0 ]; then echo "script failed"; exit 999 ; fi
"exec" 명령을 실행하고 다음 행 세트를 계속 실행하는 방법에 대한 제안
답변1
exec
명령을 인수로 사용하면 프로세스에서 실행 중인 현재 프로그램이 지정된 명령으로 바뀌므로 호출하는 셸 스크립트의 관점에서 보면 exec
요청된 명령을 실제로 실행할 수 없더라도 반환되지 않습니다.
귀하의 시나리오에서는 아마도 다음을 제거해야 할 것입니다 exec
.
/bin/sh -c " $command" > log.txt
rc=$?
if [ "$rc" -ne 0 ]; then echo>&2 "script failed"; exit 99; fi
또한 잊어버린 따옴표 $command
와 $command
로 끝나지 않도록 선행 공백을 기록 -
하고 >&2
오류가 stderr로 전송되는지 확인하세요.
255를 초과하는 값은 지정되지 않은 결과를 생성하므로 오류 코드가 999에서 99로 변경되었습니다.
요점은 $command
현재 쉘이 저장된 쉘 코드를 해석하도록 하는 것이라면 다음을 사용할 수 있습니다 eval
.
eval " $command" > log.txt
rc=$?
if [ "$rc" -ne 0 ]; then echo>&2 "script failed"; exit 99; fi
또는 더 나은:
if ! eval " $command" > log.txt; then
echo>&2 "script failed"
exit 99
fi
POSIX에서는 라고도 합니다 sh
.eval
특별한> log.txt
코드에 구문 오류가 있거나 리디렉션이 실패하는 등 내장 함수가 실패하는 경우에도 종료가 필요합니다. 이러한 경우에는 script failed
오류가 출력되지 않습니다. 이 문제는 다음을 통해 해결될 수 있습니다.
if ! command eval " $command" > log.txt; then
echo>&2 "script failed"
exit 99
fi
command
접두어를 삭제할 위치상세다음과 같은 특수 내장 명령에 적용됩니다.
zsh
시뮬레이션 중이 아니면 사용할 수 없습니다 sh
.