De una manera compatible con posix que funciona con múltiples implementaciones, ¿cómo puedo imprimir la lista de variables de entorno definidas actualmente sin sus valores?
En algunas implementaciones (mksh, freebsd / bin / sh), solo usarlo exportpor sí solo se ajustará a la factura:
$ export
FOO2
FOO
Pero para algunas otras implementaciones (bash, zsh, dash), exporttambién muestra el valor. Con bash, por ejemplo:
$ export
export FOO2='as df\
asdk=fja:\
asd=fa\
asdf'
export FOO='sjfkasjfd kjasdf:\
asdkj=fkajdsf:\
:askjfkajsf=asdfkj:\
safdkj'
$ printenv | sed -n l
FOO2=as\tdf\$
asdk=fja:\$
asd=fa\$
asdf$
FOO=sjfkasjfd kjasdf:\$
asdkj=fkajdsf:\$
\t:askjfkajsf=asdfkj:\$
safdkj$
Otras opciones como envo printenvno tienen opciones para imprimir solo los nombres de las variables sin valores, al menos no en las plataformas Linux y Freebsd que he probado.
Tuberías a awk / sed / etc. o recortar la lista con técnicas de expansión de parámetros (por ejemplo, ${foo%%=*}) es aceptable, pero tiene que funcionar con valores que pueden abarcar líneas y tener un =espacio en blanco en el valor (ver el ejemplo anterior).
Las respuestas específicas a implementaciones de shell particulares son interesantes, pero principalmente estoy buscando algo que sea compatible entre implementaciones.
export -ppara esto?
export -pporque eso le daría una salida consistente en todos los shells POSIX, que dijo que quería.
export -pno se ajusta al primer requisito: imprimir solo nombres de variables sin valores.
export -p. No voy a escribir ese análisis, porque en el caso general, también tendría que hacer un análisis de comillas apropiado, en caso de que tenga una variable cuyo valor sea similar hello\nexport var=value. Uno de los pocos otros comandos que le dará una salida consistente en todos los shells POSIX es env, pero esa salida es más difícil de analizar ya que carece del export =bit.
export -pespecificada por POSIX para generar una salida que también sea adecuada para la entrada en el shell.