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...
질문:
- 이것을 달성하기 위해 이미 만들어진 방법을 간과한 것은 아닌가?무료 소프트웨어사용 가능한 패키지 중 일부 또는 전부주류 GNU/Linux 배포판?
- 제가 간과하고 있는 일종의 버그가 있습니까?
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