Ось кілька вирішень:
$ 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
Баш вбудований compgen
повинен був використовуватися в сценаріях завершення. З цією метою compgen -v
перераховуються всі визначені змінні. Мінус: у ньому перераховані лише імена змінних, а не значення.
Ось хак, щоб також перелічити значення.
$ compgen -v | while read var; do printf "%s=%q\n" "$var" "${!var}"; done
Перевага: це чистий баш-розчин. Недолік: деякі значення псуються через інтерпретацію наскрізь printf
. Також в нижній частині корпусу та / або циклу додаються додаткові змінні.