In a posix-compatible way that works with multiple implementations, how can I print the list of currently defined environment variable without their values?
On some implementations (mksh, freebsd /bin/sh), just using export
by itself will fit the bill:
$ export
FOO2
FOO
But for some other implementations (bash, zsh, dash), export
also shows the value. With bash, for example:
$ 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$
Other options like env
or printenv
don't have options to print just the variable names without values, at least not on the linux and freebsd platforms I have tried.
Piping to awk/sed/etc. or trimming the list with parameter expansion techniques (e.g., ${foo%%*=foo%%=*}
) is acceptable, but it has to work with values that may span lines and have =
and whitespace in the value (see example above).
Answers specific to particular shell implementations are interesting, but I am primarily looking for something that is compatible across implementations.