Por padrão, set mostra as variáveis do shell , não apenas as variáveis de ambiente. Em bash funções são consideradas parte das variáveis. Consulte o link .
Se você usar env ou printenv , eles mostrarão o ambiente exportado para processos filhos, o que não é necessariamente igual ao seu bash environment:
$ foo=1
$ printenv foo
$ export foo
$ printenv foo
1
Os bash declare e typeset builtins podem listar todos os tipos de variáveis, para omitir funções:
declare -F
A saída destes está em uma forma adequada para recriar o estado em um script de shell, portanto é um pouco detalhado, embora você possa distinguir entre matrizes, inteiros e outros tipos (dependendo da versão). Veja também a saída de export -p .
E de link
você pode dizer bash para usar o modo POSIX, e set se comporta "corretamente":
( set -o posix ; set )
Isso é executado em um subshell, de modo que não altere seu shell em execução e ele pega corretamente as variáveis que ainda não foram exportadas para o ambiente herdado.