Как posix-совместимый способ, который работает с несколькими реализациями, как я могу напечатать список в настоящее время определенной переменной среды без их значений?
В некоторых реализациях (mksh, freebsd / bin / sh) простое использование export
подойдет:
$ export
FOO2
FOO
Но для некоторых других реализаций (bash, zsh, dash) export
также показано значение. С bash, например:
$ 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$
Другие опции, такие как env
или printenv
не имеют возможности печатать только имена переменных без значений, по крайней мере, не на платформах linux и freebsd, которые я пробовал.
Трубопровод к awk / sed / etc. или урезание списка методами расширения параметров (например, ${foo%%=*}
) приемлемо, но оно должно работать со значениями, которые могут занимать строки и иметь =
пробел в значении (см. пример выше).
Интересны ответы, специфичные для конкретных реализаций оболочки, но я в первую очередь ищу что-то совместимое для всех реализаций.
export -p
для этого?
export -p
потому что это даст вам согласованный вывод для всех оболочек POSIX, что вы сказали, что вы хотели.
export -p
не соответствует первому требованию - печать только имен переменных без значений.
export -p
. Я не собираюсь писать этот разбор, потому что в общем случае он должен был бы также выполнить правильный разбор кавычек, если у вас есть переменная, значение которой является чем-то вроде hello\nexport var=value
. Одной из немногих других команд, которая даст вам согласованный вывод во всех оболочках POSIX, является env
, но этот вывод сложнее проанализировать, поскольку в нем отсутствует export =
бит.
export -p
который указан в POSIX, чтобы сгенерировать вывод, который также подходит для ввода в оболочке.