Definir com segurança uma variável de ambiente

4

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...

Perguntas:

  1. Ignorei uma forma pronta para isso, fornecida por um pacote de software livre que está disponível em algumas ou em todas as principais distribuições GNU / Linux ?
  2. Eu ignorei algum tipo de bug em 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?)
por sampablokuper 07.05.2018 / 16:58

1 resposta

2

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
    
por 08.05.2018 / 20:37