É bem fácil no awk.
awk 'BEGIN{for(v in ENVIRON) print v}'
No entanto, algumas implementações do awk adicionam variáveis de ambiente próprias (por exemplo, o GNU awk adiciona AWKPATH
e AWKLIBPATH
a ENVIRON
).
A saída é ambígua se o nome de uma variável de ambiente contiver uma nova linha, o que é extremamente incomum, mas tecnicamente possível.
Uma solução sh pura seria difícil. Sua melhor aposta é começar com export -p
mas massagear em sh puro é difícil. Você pode usar sed para massagear a saída de export -p
e usar eval
para obter o shell para remover o que foi citado. Bash e zsh imprimem prefixos não padrão.
report () { echo "${1%%=*}"; };
eval "$(export -p | sed "s/^export /report /;
s/^declare -x /report /;
s/typeset -x /report /")"
Observe que, dependendo do shell, export -p
pode ou não mostrar variáveis cujo nome não é válido no shell e, se não, pode ou não citar os nomes corretamente. Por exemplo, dash, mksh e zsh omitem variáveis cujo nome inclui uma nova linha, BusyBox traço e ksh93 imprima-os em bruto, e o bash os imprime sem seu valor. Se você precisa se defender contra entradas não confiáveis, não confie em uma solução POSIX pura, e definitivamente não chame eval
em nada derivado da saída de export -p
.