По умолчанию 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 )
Он запускается в подоболочке, поэтому он не изменяет вашу работающую оболочку и правильно выбирает переменные, еще не экспортированные в унаследованную среду.