Aquí hay algunas soluciones:
$ comm -3 <(declare | sort) <(declare -f | sort)
Descompostura:
declare
imprime cada variable definida (exportada o no) y función.
declare -f
imprime solo funciones.
comm -3
eliminará todas las líneas comunes a ambos. En efecto, esto eliminará las funciones, dejando solo las variables.
Para imprimir solo variables que no se exportan:
$ comm -3 <(comm -3 <(declare | sort) <(declare -f | sort)) <(env | sort)
Otra solución alternativa:
$ declare -p
Esto solo imprimirá las variables, pero con algunos atributos feos.
declare -- BASH="/bin/bash"
declare -ir BASHPID=""
declare -A BASH_ALIASES='()'
declare -a BASH_ARGC='()'
...
Puede cortar los atributos usando ... cortar:
$ declare -p | cut -d " " -f 3
Una desventaja es que el valor de IFS se interpreta en lugar de mostrarse.
comparar:
$ comm -3 <(declare | sort) <(declare -f | sort)
...
IFS=$' \t\n'
...
$ declare -p | cut -d " " -f 3
...
IFS="
"
...
Esto hace que sea bastante difícil usar esa salida para un procesamiento posterior, debido a que está solo "
en una línea. Quizás se pueda hacer algo de IFS-fu para evitar esto.
Otra solución alternativa, usando compgen
:
$ compgen -v
El bash builtin compgen
estaba destinado a ser utilizado en scripts de finalización. Para este fin, compgen -v
enumera todas las variables definidas. La desventaja: enumera solo los nombres de las variables, no los valores.
Aquí hay un truco para enumerar también los valores.
$ compgen -v | while read var; do printf "%s=%q\n" "$var" "${!var}"; done
La ventaja: es una solución pura de bash. La desventaja: algunos valores están en mal estado debido a la interpretación a través de printf
. Además, la subshell de la tubería y / o el bucle agrega algunas variables adicionales.