Aqui estão algumas soluções alternativas:
$ comm -3 <(declare | sort) <(declare -f | sort)
demolir:
declare
imprime todas as variáveis definidas (exportadas ou não) e funções.
declare -f
imprime apenas funções.
comm -3
removerá todas as linhas comuns a ambos. Com efeito, isso removerá as funções, deixando apenas as variáveis.
Para imprimir apenas variáveis que não são exportadas:
$ comm -3 <(comm -3 <(declare | sort) <(declare -f | sort)) <(env | sort)
Outra solução alternativa:
$ declare -p
Isso imprimirá apenas as variáveis, mas com alguns atributos feios.
declare -- BASH="/bin/bash"
declare -ir BASHPID=""
declare -A BASH_ALIASES='()'
declare -a BASH_ARGC='()'
...
Você pode cortar os atributos usando ... cut:
$ declare -p | cut -d " " -f 3
Uma desvantagem é que o valor do IFS é interpretado em vez de exibido.
comparar:
$ comm -3 <(declare | sort) <(declare -f | sort)
...
IFS=$' \t\n'
...
$ declare -p | cut -d " " -f 3
...
IFS="
"
...
Isso torna bastante difícil usar essa saída para processamento adicional, por causa disso isolado "
em uma linha. Talvez algum IFS-fu possa ser feito para evitar isso.
Outra solução alternativa, usando compgen
:
$ compgen -v
O bash interno compgen
foi criado para ser usado em scripts de conclusão. Para esse fim, compgen -v
lista todas as variáveis definidas. A desvantagem: lista apenas os nomes das variáveis, não os valores.
Aqui está um hack para listar também os valores.
$ compgen -v | while read var; do printf "%s=%q\n" "$var" "${!var}"; done
A vantagem: é uma solução pura para o bash. A desvantagem: alguns valores são confusos por causa da interpretação printf
. Além disso, o subshell do pipe e / ou loop adiciona algumas variáveis extras.