Як сумісний з 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 / тощо. або обрізка списку методами розширення параметрів (наприклад, ${foo%%=*}) є прийнятною, але вона повинна працювати зі значеннями, які можуть охоплювати лінії та мати =пробіл у значенні (див. приклад вище).
Відповіді, характерні для конкретних реалізацій оболонок, цікаві, але я в першу чергу шукаю те, що сумісне в усіх реалізаціях.
export -pдля цього?
export -pтому що це дасть вам постійний вихід на всі оболонки POSIX, які ви сказали, що хочете.
export -pне відповідає першій вимозі - друкувати лише імена змінних без значень.
export -p. Я не збираюся писати цей синтаксичний розбір, тому що в загальному випадку він також повинен буде зробити належний аналіз цитат, якщо у вас є змінна, значення якої чимось схоже hello\nexport var=value. Однією з небагатьох інших команд, яка дасть вам постійний вихід у всіх оболонках POSIX, є env, але цей вихід важче проаналізувати, оскільки йому бракує export =біт.
export -pякий визначено POSIX, щоб генерувати вихід, який також підходить для введення в оболонку.