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 export
por sí solo se ajustará a la factura:
$ export
FOO2
FOO
Pero para algunas otras implementaciones (bash, zsh, dash), export
tambié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 env
o printenv
no 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 -p
especificada por POSIX para generar una salida que también sea adecuada para la entrada en el shell.export -p
para esto?export -p
porque eso le daría una salida consistente en todos los shells POSIX, que dijo que quería.export -p
no 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 similarhello\nexport var=value
. Uno de los pocos otros comandos que le dará una salida consistente en todos los shells POSIX esenv
, pero esa salida es más difícil de analizar ya que carece delexport =
bit.Respuestas:
Es bastante fácil en awk.
Sin embargo, tenga cuidado con algunas implementaciones de awk que agregan sus propias variables de entorno (por ejemplo, GNU awk add
AWKPATH
yAWKLIBPATH
toENVIRON
).El resultado es ambiguo si el nombre de una variable de entorno contiene una nueva línea, lo cual es extremadamente inusual pero técnicamente posible. Una solución pura sh sería difícil. Su mejor opción es comenzar,
export -p
pero es difícil masajearlo en sh puro. Puede usar sed para masajear la salida deexport -p
, luego usareval
para obtener el shell para eliminar lo que se cita. Bash y zsh imprimen prefijos no estándar.Tenga en cuenta que, dependiendo del shell,
export -p
puede mostrar o no variables cuyo nombre no sea válido en el shell, y si no lo hace, puede citar o no los nombres correctamente. Por ejemplo, dash, mksh y zsh omiten variables cuyo nombre incluye una nueva línea, BusyBox dash y ksh93 las imprimen sin formato y bash las imprime sin su valor. Si necesita defenderse de entradas no confiables, no confíe en una solución POSIX pura y definitivamente no invoqueeval
nada derivado de la salida deexport -p
.fuente
exit
sea necesaria).FOO<newline>BAR
, usted no sabe si se trata de unaFOO<newline>BAR
variable de entorno (queexport -p
no se muestran con la mayoría de conchas, verenv $'FOO\nBAR=test' awk 'BEGIN{for (v in ENVIRON) print v}'
) o ambos unaFOO
yBAR
variable de entorno.awk
s establece variables de entorno propias (AWKPATH
yAWKLIBPATH
en mi sistema)Me gustan las cosas simples; Esto funcionará para los sistemas POSIX:
fuente
export AAA=$'multi\nBBB=line'
compgen -e
. No ayuda para mis scripts portátiles (p. Ej., Cuando bash no está disponible), pero es interesante.dash
en debian, obtengo los mismos resultados con el comando anterior o el modificadoprintenv | sed 's;*=.;;' | sort
para obtener los valores. Exporté la variableyo
y le asigné tu primer comentario anterior; se imprimió como se esperaba, con múltiples líneas. No estoy seguro de lo que está experimentando, pero no debería haber una salida truncada. ejecuta el comando en el shell; sea lo que sea que produzca, así es como debería funcionar; no esperes truncar. Luego, dentro del contexto de TERMCAP / screen / iirc; Debería ser lo mismo. Si el resultado no coincide, entonces es probable que sea un problema con uno de esos programas.