Qual é a maneira mais simples de verificar se uma variável shell é exportada?

17

Para algumas sessões de shell, quero poder imprimir um sinalizador de aviso se uma variável do shell não estiver definida e exportada.

É bastante simples fazer algo assim para imprimir "Erro" no prompt se SET_ME não estiver definido ou nulo.

test_var () { test -z "$1" && echo Error; }
PS1='$(test_var "$SET_ME") \$ '

No entanto, isso não sinaliza se eu definir SET_ME sem exportá-lo, o que é um erro que desejo detectar. Com algo parecido com $(bash -c 'test -z "$SET_ME" && echo Error;') ou usando a saída de export , existe uma verificação simples que eu possa fazer para testar se SET_ME foi exportado?

Uma solução não POSIX, bash-only é completamente aceitável.

    
por CB Bailey 19.07.2012 / 11:52

7 respostas

10

Use o comando declare e o operador de correspondência de expressão regular:

test_var () {
    # $1 - name of a shell variable
    var=$1
    [[ -z "${!var}" ]] && echo Error
    [[ $(declare -p $1)  =~ ^declare\ -[aAilrtu]*x[aAilrtu]*\  ]] || echo Error
}
    
por 19.07.2012 / 14:49
4

Estou ciente de que a pergunta tem 3 anos, mas é possível encontrar a seguinte solução:

[ "$(bash -c 'echo ${variable}')" ]

responde, se a variável for exportada e tiver valor não vazio.

    
por 14.05.2015 / 18:27
2

Se eu me resignar a usar export e grep , o teste mais simples provavelmente é algo assim.

export | grep -Eq '^declare -x SET_ME='

ou se eu quiser não-nulo também:

export | grep -Eq '^declare -x SET_ME=".+"'
    
por 19.07.2012 / 14:10
2

No Bash 4.4 ou posterior , você pode usar o ${parameter@a} expansão de parâmetros do shell para obter uma lista de atributos sobre um parâmetro, incluindo se ele é exportado.

Aqui está uma função simples demonstrando ${parameter@a} , que informará se uma determinada variável é exportada, dado seu nome:

function is_exported {
    local name="$1"
    if [[ "${!name@a}" == *x* ]]; then
        echo "Yes - '$name' is exported."
    else
        echo "No - '$name' is not exported."
    fi
}

Exemplo de uso:

$ is_exported PATH
Yes - 'PATH' is exported.
$ foo=1 is_exported foo
Yes - 'abc' is exported.
$ bar=1; is_exported bar
No - 'abc' is not exported.
$ export baz=1; is_exported baz
Yes - 'baz' is exported.
$ export -n baz; is_exported baz
No - 'baz' is not exported.
$ declare -x qux=3; is_exported qux
Yes - 'qux' is exported.

Como funciona:

O formato retornado por ${parameter@a} é um caractere por atributo, com o significado de cada caractere de atributo vindo das opções correspondentes do declare command - neste caso, queremos procurar x - exportados.

    
por 01.09.2018 / 20:30
1

O comando export , fornecido sem parâmetros, fornece uma lista de nomes exportados no ambiente atual:

$ FOO1=test
$ FOO2=test
$ export | grep FOO
$ export FOO2
$ export | grep FOO
declare -x FOO2="test"

Alguns cortes e sedimentos eliminam o cotão:

export | cut -d' ' -f 3- | sed s/=.*//

Há sua lista de exportações, pronta para processamento posterior.

    
por 19.07.2012 / 13:58
1

O método mais simples que atualmente posso imaginar:

[ bash -c ': ${v1?}' 2>/dev/null ]
    
por 06.11.2015 / 19:56
1

Você pode usar compgen com sua opção -X para determinar se uma variável é exportada:

compgen -e -X "!$MAY_BE_EXPORTED_VARIABLE"

Por exemplo:

$ NOT_EXPORTED="xxx"
$ compgen -e -X '!SHELL'
SHELL
$ compgen -e -X '!NOT_EXPORTED'
$ echo $?
1
    
por 28.09.2016 / 04:53