Voici quelques solutions de contournement:
$ comm -3 <(declare | sort) <(declare -f | sort)
panne:
declare
imprime chaque variable définie (exportée ou non) et chaque fonction.
declare -f
imprime seulement les fonctions.
comm -3
supprimera toutes les lignes communes aux deux. En effet, cela supprimera les fonctions, ne laissant que les variables.
Pour n’imprimer que les variables non exportées:
$ comm -3 <(comm -3 <(declare | sort) <(declare -f | sort)) <(env | sort)
Une autre solution de contournement:
$ declare -p
Cela n’imprimera que les variables, mais avec quelques attributs laids.
declare -- BASH="/bin/bash"
declare -ir BASHPID=""
declare -A BASH_ALIASES='()'
declare -a BASH_ARGC='()'
...
Vous pouvez couper les attributs en utilisant ... cut:
$ declare -p | cut -d " " -f 3
Un inconvénient est que la valeur de IFS est interprétée au lieu d'être affichée.
comparer:
$ comm -3 <(declare | sort) <(declare -f | sort)
...
IFS=$' \t\n'
...
$ declare -p | cut -d " " -f 3
...
IFS="
"
...
Cela rend très difficile l'utilisation de cette sortie pour un traitement ultérieur, à cause de cette seule "
ligne. Peut-être que quelques IFS-fu peuvent être faits pour empêcher cela.
Encore une autre solution de contournement, en utilisant compgen
:
$ compgen -v
La bash intégrée a compgen
été conçue pour être utilisée dans les scripts de complétion. À cette fin, compgen -v
répertorie toutes les variables définies. L'inconvénient: il ne répertorie que les noms de variables, pas les valeurs.
Voici un hack pour lister également les valeurs.
$ compgen -v | while read var; do printf "%s=%q\n" "$var" "${!var}"; done
L'avantage: c'est une solution pure bash. L'inconvénient: certaines valeurs sont brouillées à cause de l'interprétation printf
. De plus, le sous-shell du tuyau et / ou de la boucle ajoute des variables supplémentaires.