Оболочка posix: вывести список имен переменных среды (без значений)

Вам нужен пробел между «$ non» и], и вам не нужны ():

if [ -z "$var" ] && [ -z "$non" ]
10
23.04.2018, 15:43
3 ответа

В awk это довольно просто.

awk 'BEGIN{for(v in ENVIRON) print v}'

Однако имейте в виду, что некоторые реализации awk добавляют собственные переменные окружения (, например. GNU awk добавляет AWKPATHи AWKLIBPATHк ENVIRON).

Вывод будет неоднозначным, если имя переменной окружения содержит новую строку, что крайне необычно, но технически возможно. Чистое решение sh было бы трудным. Лучше всего начать с export -p, но массировать его в чистом виде сложно. Вы можете использовать sed для обработки вывода export -p, а затем использовать eval, чтобы заставить оболочку удалить то, что она процитировала. Bash и zsh печатают нестандартные префиксы -.

report () { echo "${1%%=*}"; };
eval "$(export -p | sed "s/^export /report /;
                         s/^declare -x /report /;
                         s/typeset -x /report /")"

Обратите внимание, что в зависимости от оболочки export -pможет отображать или не отображать переменные, имена которых недействительны в оболочке, и если это не так, то имена могут быть заключены в кавычки, а могут и нет. Например, dash, mksh и zsh пропускают переменные, имя которых включает новую строку, тире BusyBox и ksh93 печатают их в необработанном виде, а bash печатает их в необработанном виде без их значения. Если вам нужно защититься от ненадежного ввода,не полагайтесь на чистое решение POSIX и определенно не вызывайте evalдля чего-либо, полученного из вывода export -p.

10
27.01.2020, 20:02

Я люблю простые вещи; это будет работать для систем POSIX:

printenv | sed 's;=.*;;' | sort
HOME
HOSTNAME
PATH
PWD
SHLVL
TERM
2
27.01.2020, 20:02

Вот мое решение, которое хорошо обрабатывает переменные окружения, имеющие многострочные -значения:

env -0 | cut -z -f1 -d= | tr '\0' '\n' | sort | column

Это напечатает среду, используя NUL для разделения переменных вместо новой строки (env -0).

Затем мы удаляем значения переменной с помощью cut -z -f1 -d=, где опция -zуказывает NUL -записей с разделителями, -f1— первое поле, а -d=говорит, что поля ограниченный =.

tr '\0' '\n'преобразует разделители NUL в новые строки.

Затем мне нравится сортировать имена переменных и отображать их в столбцах.

1
05.02.2021, 15:58

Теги

Похожие вопросы