Oto kilka obejść:
$ comm -3 <(declare | sort) <(declare -f | sort)
awaria:
declare
wypisuje każdą zdefiniowaną zmienną (eksportowaną lub nie) i funkcję.
declare -f
drukuje tylko funkcje.
comm -3
usunie wszystkie linie wspólne dla obu. W efekcie spowoduje to usunięcie funkcji, pozostawiając tylko zmienne.
Aby wydrukować tylko zmienne, które nie są eksportowane:
$ comm -3 <(comm -3 <(declare | sort) <(declare -f | sort)) <(env | sort)
Kolejne obejście:
$ declare -p
Spowoduje to wydrukowanie tylko zmiennych, ale z pewnymi brzydkimi atrybutami.
declare -- BASH="/bin/bash"
declare -ir BASHPID=""
declare -A BASH_ALIASES='()'
declare -a BASH_ARGC='()'
...
Możesz wyciąć atrybuty za pomocą ... cut:
$ declare -p | cut -d " " -f 3
Jednym minusem jest to, że wartość IFS jest interpretowana zamiast wyświetlana.
porównać:
$ comm -3 <(declare | sort) <(declare -f | sort)
...
IFS=$' \t\n'
...
$ declare -p | cut -d " " -f 3
...
IFS="
"
...
To sprawia, że dość trudno jest użyć tego wyjścia do dalszego przetwarzania, ponieważ jest on samotny "
w jednej linii. Być może można to zrobić za pomocą IFS-fu, aby temu zapobiec.
Jeszcze jedno obejście, używając compgen
:
$ compgen -v
Wbudowane bash compgen
miało być używane w skryptach ukończenia. W tym celu compgen -v
wymienia wszystkie zdefiniowane zmienne. Wada: zawiera tylko nazwy zmiennych, a nie wartości.
Oto hack, aby również wymienić wartości.
$ compgen -v | while read var; do printf "%s=%q\n" "$var" "${!var}"; done
Zaleta: jest to czyste rozwiązanie. Wada: niektóre wartości są pomieszane z powodu interpretacji printf
. Również podpowłoka z potoku i / lub pętli dodaje dodatkowe zmienne.