서브쉘/하위 프로세스의 bash 'nounset'은 기본 스크립트를 강제로 종료하지 않습니다. 이 문제를 전역적으로 어떻게 해결할 수 있습니까?

서브쉘/하위 프로세스의 bash 'nounset'은 기본 스크립트를 강제로 종료하지 않습니다. 이 문제를 전역적으로 어떻게 해결할 수 있습니까?

다음 스크립트를 사용하세요.tstNounset.sh

#!/bin/bash
set -x 
set -o nounset;set -u

echo `echo $str`
function FUNC1() { echo $str; };export -f FUNC1;bash -c FUNC1
function FUNC2() { set -u;echo $str; };export -f FUNC2;bash -c FUNC2
echo "A - should not reach here?"
echo $str
echo "B - doesn't reach here."

모든 변수를 확인하지 않고 전역적으로 "A"에 도달하는 것을 방지하고 싶습니다.

둘 중 하나도 사용되지 않습니다 set -e. 대부분의 오류와 해결 방법은 단지 경고일 뿐이므로 대부분의 오류와 해결 방법을 다루었기 때문입니다.

감지할 수 있는 방법이 있는지 궁금합니다."바인딩되지 않은 변수"서브쉘/하위 프로세스에서도 발생하므로 강제로 종료할 수 있나요?

나는 일을 할 수 없다_each_ 명령을 사용하여 오류에 대해 특정 작업을 수행하도록 bash 스크립트에 어떻게 지시할 수 있습니까?또는Trap 명령을 사용하여 오류를 트리거하는 방법반품. 나는 이것을 찾았다오래된 질문또한.

답변1

서브쉘

서브쉘은 전체 스크립트를 종료할 수 없습니다. 의 영향으로 set -u하위 쉘은 자신의 부모에게 "이봐, 이것을 치명적인 오류로 처리하길 원해"라고 말할 수 없습니다. set -u하위 쉘에서는 작동하지만 상위 쉘에서는 작동하지 않는 경우 에도 의미가 없습니다. 서브쉘이 할 수 있는 일은 0이 아닌 종료 코드를 반환하는 것뿐입니다. 수동으로 또는 를 통해 상위 항목의 종료 코드를 처리할 수 있습니다 set -e.

(set -u; …; echo $undefined_variable)
# here $? is nonzero
ret=$?; if [ $ret -ne 0 ]; then exit $ret; fi

하위 프로세스

여기서 하고 있는 일은 서브쉘이 아닙니다. 다른 프로그램을 시작하는 것입니다. 다른 프로그램은 현재 스크립트를 실행하는 인터프리터이기도 한 bash이지만 이는 우연의 일치입니다. bash가 호출하는 프로그램의 설정으로 인해 bash 자체가 종료될 이유가 전혀 없습니다.

set +e
bash -c 'do something'
echo "A - should and does reach here"

이것은 여러분이 작성한 것과 다르지 않습니다 perl -e 'use strict; print $barf'. Perl은 종료되고 0이 아닌 상태를 반환하지만 이로 인해 bash 스크립트가 종료되지는 않습니다(아래 제외 set -e). set -e하위 프로세스가 0이 아닌 반환 코드를 반환할 때 종료하려면 사용합니다.

답변2

내 스크립트가 잘못 코딩되었지만 수정할 수 있습니다.

첫 번째, 두 번째, 세 번째 댓글을 살펴보세요.

  • 첫 번째는 오류를 잡아야 합니다.
  • 두 번째 실수, 갇히지 않도록 조심해야 해요! 그것을 사용하지 않으면 if ! ...$?를 사용하여 반환 값을 얻을 수 없습니까?
  • 셋째, 직접 에코하지 말고 중간 변수를 사용하여 오류를 포착할 수 있습니다.

tstNounset.sh:

#!/bin/bash
trap 'ErrorHappened;exit 1' ERR #1st A TRAP ERR IS REQUIRED

set -x 
set -o nounset;set -u

#echo `echo $str`
nRet=0;if strA="`echo $str`";then : ;else nRet=$?;echo "Err$nRet";fi #2rd errors that you take care wont be trapped! do not use `if ! ...` will prevent getting return value with $?
echo "0 - should not reach here?"
strA="`echo $str`";echo "$strA" #3nd DO NOT ECHO DIRECTLY, use a intermediary variable so the error can be cautch
echo "1 - should not reach here?"
function FUNC1() { echo $str; };export -f FUNC1;bash -c FUNC1
function FUNC2() { set -u;echo $str; };export -f FUNC2;bash -c FUNC2
echo "A - should not reach here?"
echo $str
echo "B - doesnt reach here."

관련 정보