Вывести все переменные окружения, но пропустить многострочные переменные - PullRequest
1 голос
/ 17 июня 2019

Я хочу напечатать все переменные среды, кроме определенных переменных.

Поэтому я нашел решение для stackoverflow: Bash: перебрать переменные, содержащие шаблон в имени

while IFS='=' read -r name value; do
    if [ ! "$name" = "SOMEVAR" -a ! "$name" = "SOMEOTHERVAR" ]; then
        echo "$name=$value"
    fi
done < <(env)

Однако это не работает, если мои переменные окружения содержат символы новой строки, такие как:

export SOMEVAR="some
text with
newlines"

. При использовании приведенного выше решения будет напечатано:

text with=
newlines=
PWD=/home/...
...

Я также пытался использовать нуль-завершенные строки и многострочное сопоставление с sed:

env -0 | sed -e '{N; s@SOMEVAR.*\x0@@ ; D}' | tr '\0' '\n'

Но это обрезает вывод и всегда сначала печатает последнюю строку переменной с многострочным содержимым:

newlines
PWD=/home/...
...

IsЕсть ли способ пропустить многострочные переменные среды при их печати?

Ответы [ 2 ]

2 голосов
/ 17 июня 2019

У вас это почти получилось, вам просто нужно перебрать вывод env -0 с помощью команды чтения и нулевого разделителя и исключить переменные с помощью оператора регулярного выражения

while read -r -d '' line; do 
    [[ ! $line =~ ^(SOMEVAR|SOMEOTHERVAR)= ]] && printf '%s\n' "$line" 
done < <(env -0)

Команда read сd '' подразумевает разделение ввода на символе с нулевым разделителем.Цикл while работает до тех пор, пока не будет проанализирована последняя строка с разделителями.

Также это просто печатает все переменные, исключая те, которые вы хотите избежать.Для дальнейшей обработки каждой из строк вы можете разобрать переменную $line, чтобы разделить пары key / value и использовать ее соответствующим образом.

Или есливы намеревались идентифицировать любую переменную, содержащую многострочную строку, вы можете исключить это с регулярным выражением как

[[ ! $line =~ $'\n' ]] 
1 голос
/ 17 июня 2019

Вы можете использовать встроенную команду bash compgen, которая выводит все имена переменных env при использовании с параметром -v так:

compgen -v # prints all variable names

Теперь вы можете легко использовать это в цикле, чтобы исключить нежелательные имена и вывести на печатьотдых:

while read var; do
   echo "$var=${!var}"
done < <(compgen -v | grep -vxFE '(SOMEVAR|SOMEOTHERVAR)')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...