환경 변수를 안전하게 정의

환경 변수를 안전하게 정의

AFAICT, GNU Bash 또는 기타 관련 패키지(예:GNU 핵심 도구)는 GNU/Linux 배포판에서 일반적이며, 시도가 실패하도록 환경 변수를 정의하는 미리 만들어진 방법이 있습니다.보여주다환경 변수가 이미 있으면 실패합니다. 본질적으로 변수 할당을 위한 "파괴 없음" 옵션이며 실패 시 종료 상태가 0이 아닙니다.

쉘 매개변수 확장(일명 "매개변수 대체") 방법은 중단을 방지하지만 실패를 보고하지 않습니다.

unset MY_VARIABLE
: ${MY_VARIABLE:='my_value'}
: ${MY_VARIABLE:='this_will_fail_but_will_nevertheless_have_exit_code_0'}
echo $?
0
echo $MY_VARIABLE
my_value

내가 생각해낸 최선의 해결 방법은 safedef이 목적을 위해 함수("")를 만드는 것입니다.

die() {
    echo -e >&2 "$@"
    exit 1
}

safedef() {
    if [ -v $1 ]; then
        die 'Name conflict. Variable already defined. Will not overwrite it.'
    else
        # Create and assign environment variable
        export $1="${*:2}"
    fi
}

safedef MY_VARIABLE 'my_value'
safedef MY_OTHER_VARIABLE 'my_other_value'
# Etc, etc...

질문:

  1. 이것을 달성하기 위해 이미 만들어진 방법을 간과한 것은 아닌가?무료 소프트웨어사용 가능한 패키지 중 일부 또는 전부주류 GNU/Linux 배포판?
  2. 제가 간과하고 있는 일종의 버그가 있습니까? safedef즉, 예상대로 예기치 않게 작동하지 않을 가능성이 가장 높습니까? (그렇다면 오류는 무엇이며 더 나은 접근 방식은 무엇입니까?)

답변1

Bash에서 다음을 발견했습니다.

unset MY_VARIABLE
: ${MY_VARIABLE='my_value'}
MY_VARIABLE=${MY_VARIABLE:+$( false )}${MY_VARIABLE:-'this_will_fail_with_exit_1'}
echo $?
echo $MY_VARIABLE

이것은 다음을 인쇄합니다:

1
my_value

관련 정보