Bash, импортировать вывод из команды как команду

Система

Linux hosek 4.15.0-48-generic #51-Ubuntu SMP Wed Apr 3 08:28:49 UTC 2019 x86_64 x86_64 x86_64 GNU/Linux

Выпуск

Мне нужно получить вывод в виде команд, в скрипте bash, для хранения переменных.

Пример

sed -n '/# Main configuration./,/# Websites./p' webcheck-$category.cfg | sed '1,1d' | sed '$ d'

Эта команда возвращает эти строки.

email_sender='some@email.com'
email_recipients='another@email.com'

Как я могу прочитать / запустить эти выходные данные / строки как команды в скрипте? Сохраняет ли этот вывод в файл и затем читает его только командой source?

Я пытался | source в конце команды, но он читает только из файлов. Я попробовал echo в начале, но безрезультатно.

Спасибо.

8
задан 12 September 2019 в 14:02

4 ответа

Поскольку pLumo показал Вам, Вы можете действительно source их. Однако я рекомендовал бы против этого. Если у Вас есть что-то вроде этого:

source <(sed -n '/# Main configuration./,/# Websites./p' webcheck-$category.cfg | sed '1,1d' | sed '$ d')

echo "$email_sender"

Затем год спустя, когда Вы возвращаетесь и смотрите на этот сценарий, Вы будете понятия не иметь где это email_sender переменная прибывает из. Я предлагаю, чтобы Вы вместо этого изменили команду и использовали ту, которая возвращает только значение переменной и не его имя. Тем путем можно легко отслеживать то, куда каждая переменная прибывает из:

email_sender=$(grep -oP 'email_sender=\K.*' webcheck-$category.cfg)
email_recipients=$(grep -oP 'email_recipients=\K.*' webcheck-$category.cfg)
15
ответ дан 23 November 2019 в 05:25

Можно использовать замену процесса:

source <(sed -n '/# Main configuration./,/# Websites./p' webcheck-$category.cfg | sed '1,1d' | sed '$ d')
3
ответ дан 23 November 2019 в 05:25
#!/bin/bash

declare -A data
while IFS='=' read -r key value; do
    data[$key]=${value//\'/}
done < <(grep -E '^([^#].+=.*)' webcheck-$category.cfg)

или

done < <(sed -n '/# Main configuration./,/# Websites./{//!p}' webcheck-$category.cfg)
# associative array.
echo ${data[email_sender]}
echo ${data[email_recipients]}

Вывод:

some@email.com another@email.com

0
ответ дан 23 November 2019 в 05:25

колотите читает встроенные вещи дескрипторов как это приятно.

read -d '' -r email_sender email_recipients < <(
  grep -oP 'email_sender=\K.*' webcheck-$category.cfg; 
  grep -oP 'email_recipients=\K.*' webcheck-$category.cfg
)

read строки чтений от stdin в переменные. -d '' выключает пробельное разделение, за исключением новых строк. -r отключает \ Escape.

cmdA < <(cmdB) работы так же к cmdB | cmdA, кроме бывшего cmdA выполняется в ~this ~ оболочка, вместо подоболочки, которая требуется, чтобы чтение работало как ожидалось.

-1
ответ дан 23 November 2019 в 05:25

Другие вопросы по тегам:

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