По умолчанию set показывает переменные оболочки, а не только переменные окружения. В bash функции считаются частью переменных. См. Https://askubuntu.com/questions/26318/environment-variable-vs-shell-variable-whats-the-difference .
Если вы используете env или printenv они покажут среду, экспортированную в дочерние процессы, которая не обязательно совпадает с вашей средой bash :
$ foo=1
$ printenv foo
$ export foo
$ printenv foo
1
Баш declare и typeset встроенных команды могут перечислить все типы переменных, чтобы опустить функции:
declare -F
Их выходные данные находятся в форме, подходящей для воссоздания состояния в сценарии оболочки, поэтому он немного многословен, хотя вы можете различать массивы, целые числа и другие типы (в зависимости от версии). Смотрите также вывод export -p .
А с https://stackoverflow.com/questions/1305237/how-to-list-variables-declared-in-script-in-bash вы можете указать bash использовать режим POSIX и set поведение "правильно":
( set -o posix ; set )
Он запускается в подоболочке, поэтому он не изменяет вашу работающую оболочку и правильно выбирает переменные, еще не экспортированные в унаследованную среду.