Вот некоторые обходные пути:
$ comm -3 <(declare | sort) <(declare -f | sort)
сломать:
declare
печатает каждую определенную переменную (экспортированную или нет) и функцию.
declare -f
печатает только функции.
comm -3
удалит все строки, общие для обоих. По сути это удалит функции, оставив только переменные.
Чтобы печатать только переменные, которые не экспортируются:
$ comm -3 <(comm -3 <(declare | sort) <(declare -f | sort)) <(env | sort)
Другой обходной путь:
$ declare -p
Это будет печатать только переменные, но с некоторыми уродливыми атрибутами.
declare -- BASH="/bin/bash"
declare -ir BASHPID=""
declare -A BASH_ALIASES='()'
declare -a BASH_ARGC='()'
...
Вы можете вырезать атрибуты, используя ... cut:
$ declare -p | cut -d " " -f 3
Недостатком является то, что значение IFS интерпретируется, а не отображается.
Для сравнения:
$ comm -3 <(declare | sort) <(declare -f | sort)
...
IFS=$' \t\n'
...
$ declare -p | cut -d " " -f 3
...
IFS="
"
...
Это делает довольно трудным использование этого вывода для дальнейшей обработки из-за того, что он находится "
в одной строке. Возможно, некоторые IFS-фу можно сделать, чтобы предотвратить это.
Еще один обходной путь, использующий compgen
:
$ compgen -v
Встроенный bash compgen
предназначался для использования в скриптах завершения. Для этого compgen -v
перечислены все определенные переменные. Недостаток: в нем перечислены только имена переменных, а не значения.
Вот хак, чтобы также перечислить значения.
$ compgen -v | while read var; do printf "%s=%q\n" "$var" "${!var}"; done
Преимущество: это чисто решение Bash. Недостаток: некоторые значения перепутаны из-за интерпретации до конца printf
. Также подоболочка из канала и / или цикла добавляет некоторые дополнительные переменные.