Hier sind einige Problemumgehungen:
$ comm -3 <(declare | sort) <(declare -f | sort)
Nervenzusammenbruch:
declare
druckt jede definierte Variable (exportiert oder nicht) und Funktion.
declare -f
druckt nur Funktionen.
comm -3
entfernt alle beiden gemeinsamen Zeilen. Tatsächlich werden dadurch die Funktionen entfernt, und nur die Variablen bleiben erhalten.
So drucken Sie nur Variablen, die nicht exportiert werden:
$ comm -3 <(comm -3 <(declare | sort) <(declare -f | sort)) <(env | sort)
Eine andere Problemumgehung:
$ declare -p
Dadurch werden nur die Variablen mit einigen hässlichen Attributen gedruckt.
declare -- BASH="/bin/bash"
declare -ir BASHPID=""
declare -A BASH_ALIASES='()'
declare -a BASH_ARGC='()'
...
Sie können die Attribute mit ... cut entfernen:
$ declare -p | cut -d " " -f 3
Ein Nachteil ist, dass der Wert von IFS interpretiert und nicht angezeigt wird.
vergleichen Sie:
$ comm -3 <(declare | sort) <(declare -f | sort)
...
IFS=$' \t\n'
...
$ declare -p | cut -d " " -f 3
...
IFS="
"
...
Dies macht es ziemlich schwierig, diese Ausgabe für die weitere Verarbeitung zu verwenden, da sie nur "
in einer Zeile vorhanden ist. Vielleicht kann etwas IFS-Fu getan werden, um dies zu verhindern.
Noch eine Problemumgehung mit compgen
:
$ compgen -v
Die eingebaute Bash compgen
sollte in Vervollständigungsskripten verwendet werden. Zu diesem Zweck compgen -v
werden alle definierten Variablen. Der Nachteil: Es werden nur die Variablennamen aufgeführt, nicht die Werte.
Hier ist ein Hack, um auch die Werte aufzulisten.
$ compgen -v | while read var; do printf "%s=%q\n" "$var" "${!var}"; done
Der Vorteil: Es ist eine reine Bash-Lösung. Der Nachteil: Einige Werte sind durch die Interpretation durcheinander printf
. Auch die Subshell aus der Pipe und / oder der Schleife fügt einige zusätzliche Variablen hinzu.