"source"를 사용하여 스크립트를 실행할 때 설정을 올바르게 복원하는 방법은 무엇입니까?


9

source환경을 수정하는 것이기 때문에를 사용하여 실행 해야하는 스크립트를 작성 중입니다. 스크립트 중에 set -e오류가 스크립트를 중지 하도록 사용하고 싶습니다 . 스크립트는 다음과 같습니다.

#!/bin/bash
set -e
# do something
cd somewhere
source anotherScript

문제는 set -e스크립트가 끝난 후에도 자연스럽게 적용 된다는 것 입니다. set스크립트가 중지되면 변경된 옵션이 이전 값으로 올바르게 복원되도록하려면 어떻게해야합니까 (어떻게 든 성공적으로 완료하거나 오류가 발생하여)?



echo 명령에 대한 실행 추적 억제 에서 동일한 문제 ( -x/ xtrace옵션)가 해결 됩니까?
Scott

답변:


3

정확히 같은 방법으로 buitin 호출 set:

$ set -o errexit
$ set -o | grep errexit
errexit         on
$ set +o errexit
$ set -o | grep errexit
errexit         off

로부터 bash(1)맨 페이지의 아래 SHELL BUILTIN COMMANDS부분, '설정'명령 :

-o option-name
The option-name can be one of the following:
    errexit Same as -e.

3
이러한 설정을 저장하고 모두 복원하는 방법이 있습니까?
Petr Pudlák

set -o현재 설정을 알고 실행하십시오 . 스크립트에서 스크립트를 설정 / 설정 해제 할 때 명시 적이어야합니다.
dawud

12

이 명령 set +o은 현재 설정을 동일한 상태를 복원하는 명령으로 나열합니다 (예 :

$ set +o
set +o allexport
set -o braceexpand
set -o emacs
set +o errexit
set +o errtrace
...

이 출력을 쉘 변수에 저장하면 나중에 모든 옵션을 쉽게 복원 할 수 있습니다.

SAVED_OPTIONS=$(set +o)
set -e
# do something
eval "$SAVED_OPTIONS"

Bash에는 shopt명령을 사용하여 조정되는 많은 비표준 (POSIX 아님) 옵션도 포함되어 있습니다 . 이 명령 shopt -p을 사용하여 이러한 옵션을 비슷한 방식으로 저장할 수 있습니다.

하나의 옵션 만 저장하고 복원하려면 $-환경 변수를 사용하면 현재 옵션 세트가 문자로 나열됩니다. 예 :

$ echo $-
himBH

다음과 같은 것을 사용하여 특정 옵션을 저장하고 복원 할 수 있습니다.

[[ $- = *e* ]]
SAVED_ERREXIT=$?
set -e
# do something
(( $SAVED_ERREXIT )) && set +e

평가 호출에서 "$ SAVED_OPTIONS"주위의 따옴표를 놓치지 않는 것이 중요합니다.
Matt

3

RETURN 트랩 사용

RETURN 트랩은 소스 스크립트에서도 작동합니다.

RETURN트랩으로 지정된 명령 은 쉘 함수 또는 쉘 스크립트로 실행 .되거나 source리턴 된 후에 실행이 재개되기 전에 실행됩니다 .

https://www.gnu.org/software/bash/manual/bash.html

main_script.sh

#!/usr/bin/env bash
echo "inside main script"
shopt -o errexit
source a_script_to_be_sourced.sh
echo "back inside main script"
shopt -o errexit

a_script_to_be_sourced.sh

trap "$(shopt -p -o errexit)" RETURN
set -e # Equivalents: set -o errexit; shopt -s -o errexit
echo "inside sourced script"
shopt -o errexit

테스트

$ ./main_script.sh 
inside main script
errexit         off
inside sourced script
errexit         on
back inside main script
errexit         off

2

다음과 같이 이전에 활성화 된 설정을 빠르게 복원 할 수 있습니다.

PREV_SETTING=$-  # e.g. himxBH  (there was xtrace)

set +x
# do your script without xtrace, ...

set -$PREV_SETTING

다른 방법 (오프 상태로 복원) AFAIK에는 그러한 지름길이 없으며 Seppo의 답변은 모든 경우를 다룹니다.


플래그가 대화식 쉘을 나타 -bash: set: -i: invalid option내기 때문에 작성된 코드가 생성 -i됩니다.
dpw
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.