Aqui estão algumas soluções alternativas:
$ comm -3 <(declare | sort) <(declare -f | sort)
quebra:
-
declare
imprime todas as variáveis definidas (exportadas ou não) e função.
-
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 só imprimirá 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 ... cortar:
$ declare -p | cut -d " " -f 3
Uma desvantagem é que o valor do IFS é interpretado em vez de exibido.
compare:
$ comm -3 <(declare | sort) <(declare -f | sort)
...
IFS=$' \t\n'
...
$ declare -p | cut -d " " -f 3
...
IFS="
"
...
Isso dificulta bastante o uso dessa saída para processamento adicional, por causa desse único "
em uma linha. Talvez algum IFS-fu possa ser feito para evitar isso.
Ainda outra solução alternativa, usando compgen
:
$ compgen -v
O bash builtin compgen
foi criado para ser usado em scripts de conclusão. Para este fim, compgen -v
lista todas as variáveis definidas. O lado negativo: lista apenas os nomes das variáveis, não os valores.
Aqui está um hack para listar os valores.
$ compgen -v | while read var; do printf "%s=%q\n" "$var" "${!var}"; done
A vantagem: é uma solução bash pura. A desvantagem: alguns valores são confusos devido à interpretação através de printf
. Além disso, o subshell do pipe e / ou do loop adiciona algumas variáveis extras.