'exec'가 스크립트를 종료하고 다음 단계를 계속하지 않습니다.

'exec'가 스크립트를 종료하고 다음 단계를 계속하지 않습니다.

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.

관련 정보