Как я могу импортировать вывод из команды как команду в Bash?

8

система

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в начале, но это не имело никакого эффекта.

Спасибо.

genderbee
источник

Ответы:

15

Как показал вам 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)
terdon
источник
Я согласен, что это лучше ;-) По крайней мере, для сценариев, которые вы собираетесь использовать позже.
pLumo
Спасибо обоим! Красиво и просто. ;)
пол пчелы
Для двоих это нормально, для большего я использую циклы с косвенным обращением: for var in email_sender email_recipient email_subject email_attachement etc ; do printf -v "${var}" '%s' "$(grep -oP $var'=\K.*' webcheck-$category.cfg)"; doneоднако это не соответствует «простым» критериям.
Закон 29
0
#!/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

bac0n
источник
-1

Встроенное в bash read обрабатывает подобные вещи.

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

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

cmdA < <(cmdB)работает аналогично cmdB | cmdA, за исключением предыдущего, cmdA запускается в этой оболочке, а не в подоболочке, которая требуется для правильной работы чтения.

Эван Бенн
источник
1
Можете ли вы объяснить некоторые части линии?
Саймон
Это правда, но как это относится к вопросу, заданному, где целью является чтение из файла var=value?
Тердон