-e가 bash 스크립트 내에 설정되어 있는지 확인할 수 있습니까?


9

쉘 기능이 작동하기 위해 특정 -e / + e 설정이 필요한 경우, 해당 설정을 로컬로 설정 한 다음 기능을 종료하기 전에 이전 설정으로 복원 할 수 있습니까?

myfunction()
{
   # Query here if -e is set and remember in a variable?
   # Or push the settings to then pop at the end of the function?
   set +e
   dosomething
   doanotherthing
   # Restore -e/+e as appropriate, don't just do unconditional   set -e
}

답변:


12

변수에 현재 플래그가 설정되어 $-있으므로 함수 시작시이를 유지하고 나중에 복원 할 수 있습니다.

save=$-
...
if [[ $save =~ e ]]
then set -e
else set +e
fi

주목해야한다 $-또한 작동 /bin/sh하고 당신은 아마 예를 들어 대체 (globbing)이 사용을 구문 분석 bashisms 필요하지 않습니다 case제공
요시프 로댕

2

SHELLOPTS 변수를 통해 플래그 값을 읽을 수 있습니다.

  > set +e 
  > echo $SHELLOPTS
    braceexpand:emacs:hashall:histexpand:history:interactive-comments:monitor
  > set -e 
  > echo $SHELLOPTS
    braceexpand:emacs:errexit:hashall:histexpand:history:interactive-comments:monitor

를 설정 한 후의 set -eerrexit$SHELLOPTS나타납니다. 거기에서 확인할 수 있습니다.

그러나 다음 사항을 기억 하여이 문제를 해결할 수 있습니다 ( 수동 에 따라) .

-e :

.....이 옵션은 쉘 환경과 각 서브 쉘 환경에 개별적으로 적용됩니다.

따라서 하위 쉘에서 함수를 실행하면

   zz="$(myfunction)"

errexit호출 환경에 변수가 설정되어 있는지 여부에 대해 걱정할 필요가 없으며 원하는대로 설정할 수 있습니다.


감사합니다. SHELLOPTS는 알아두면 유용합니다. @meuh가 제안한 $-를 프로그래밍 방식으로 확인하는 것이 더 쉽다는 것을 알았습니다. 그래서 그 대답을 수락했습니다.
usta

서브 쉘에 대한 참고 사항도 유용하지만 호출 사이트를 수정하지 않기를 원했습니다. 그렇지 않으면 myfunction호출에 myfunction || true대한 -e의 효과를 억제 하기 위해 호출을 변경 set +e하고 처음에는 함수 내부에서 수행 할 필요가 없습니다 .
usta

@MariusMatutiae : 20000 축하합니다.
Scott
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.