No bash, encontrei o seguinte:
unset MY_VARIABLE
: ${MY_VARIABLE='my_value'}
MY_VARIABLE=${MY_VARIABLE:+$( false )}${MY_VARIABLE:-'this_will_fail_with_exit_1'}
echo $?
echo $MY_VARIABLE
Isto imprime:
1
my_value
AFAICT, nem o GNU Bash, nem qualquer outro pacote relevante (por exemplo, GNU coreutils ) que é comumente disponível no GNU / Distribuições Linux, tem uma maneira pronta para definir uma variável de ambiente de tal forma que a tentativa irá falhar e indicar falha, se a variável de ambiente já existir. Essencialmente, uma opção "no-clobber" para atribuição de variável, com um status de saída diferente de zero em caso de falha.
abordagens de expansão do parâmetro Shell (também conhecido como "substituição de parâmetro") evite a turbulência, mas não relate falha:
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
A melhor solução que consegui criar é uma função (" safedef
") para esse propósito:
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...
safedef
, o que significa que ele pode, inesperadamente, não funcionar como pretendido? (Se sim, qual é o bug e qual pode ser uma abordagem melhor?)