Як я можу імпортувати вихід з команди як команду в 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на початку, але це не мало ефекту.

Дякую.

Відповіді:


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)

Я згоден, це краще ;-) Принаймні для сценаріїв, які ви збираєтесь використовувати пізніше.
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


-1

Баш читати вбудований обробляє такі речі чудово.

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відключає \втечі.

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


1
Чи можете ви пояснити різні частини рядка?
Саймон Судлер

Це правда, але наскільки це стосується заданого питання, де мета читати з файлу var=value?
тердон
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.