Come posso importare l'output da un comando come comando in Bash?


8

Sistema

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

Problema

Ho bisogno di ottenere l'output come comandi, in uno script bash, per memorizzare le variabili.

Esempio

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

Questo comando restituisce queste righe:

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

Come posso leggere / eseguire questi output / righe come comandi nello script? La memorizzazione di questo output nel file e quindi la legge solo in base al sourcecomando?

Ho provato | sourcealla fine del comando, ma legge solo dai file.

Ho provato echoall'inizio, ma questo non ha avuto alcun effetto.

Grazie.

Risposte:


15

Come ti ha mostrato pLumo , puoi davvero sourcefarli. Tuttavia, raccomanderei contro questo. Se hai qualcosa del genere:

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

echo "$email_sender"

Quindi, un anno dopo, quando torni a guardare questo script, non avrai idea da dove email_senderprovenga questa variabile. Ti suggerisco invece di modificare il comando e utilizzarne uno che restituisca solo il valore della variabile e non il suo nome. In questo modo, puoi facilmente tenere traccia della provenienza di ogni variabile:

email_sender=$(grep -oP 'email_sender=\K.*' webcheck-$category.cfg)
email_recipients=$(grep -oP 'email_recipients=\K.*' webcheck-$category.cfg)

Sono d'accordo che sia meglio ;-) Almeno per gli script che intendi utilizzare in seguito.
pLumo,

Grazie ad entrambi! Bello e semplice. ;)
genderbee,

Per due va bene, per di più uso per i loop con un riferimento indiretto: for var in email_sender email_recipient email_subject email_attachement etc ; do printf -v "${var}" '%s' "$(grep -oP $var'=\K.*' webcheck-$category.cfg)"; donetuttavia questo non soddisfa i criteri "semplici".
Legge


0
#!/bin/bash

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

o

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

Produzione:

some@email.com another@email.com


-1

bash read builtin gestisce cose come questa in modo piacevole.

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

readlegge le righe dallo stdin in variabili. -d ''disattiva la divisione degli spazi, ad eccezione delle nuove righe. -rdisabilita le \fughe.

cmdA < <(cmdB)funziona in modo simile a cmdB | cmdA, ad eccezione del precedente cmdA, viene eseguito in ~ this ~ shell, anziché in una subshell, che è necessario affinché la lettura funzioni come previsto.


1
Puoi dare qualche spiegazione sulle diverse parti della linea?
Simon Sudler,

Questo è vero, ma come è rilevante per la domanda posta dove deve essere letto l'obiettivo da un file var=value?
terdon,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.