Como posso importar a saída de um comando como um comando no 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

Questão

Eu preciso obter a saída como comandos, em um script bash, para armazenar variáveis.

Exemplo

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

Este comando retorna estas linhas:

email_sender='[email protected]'
email_recipients='[email protected]'

Como posso ler / executar essas saídas / linhas como comandos no script? Está armazenando essa saída no arquivo e, em seguida, a lê apenas por sourcecomando?

Eu tentei | sourceno final do comando, mas ele lê apenas de arquivos.

Eu tentei echono começo, mas isso não teve efeito.

Obrigado.

genderbee
fonte

Respostas:

15

Como o pLumo lhe mostrou , você pode de fato sourceeles. No entanto, eu recomendaria contra isso. Se você tem algo parecido com isto:

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

echo "$email_sender"

Então, um ano depois, quando você voltar e examinar esse script, não terá idéia de onde essa email_sendervariável vem. Sugiro que você mude o comando e use um que retorne apenas o valor da variável e não o nome. Dessa forma, você pode acompanhar facilmente de onde vem cada variável:

email_sender=$(grep -oP 'email_sender=\K.*' webcheck-$category.cfg)
email_recipients=$(grep -oP 'email_recipients=\K.*' webcheck-$category.cfg)
Terdon
fonte
Concordo que é melhor ;-) Pelo menos para scripts que você pretende usar mais tarde.
pLumo 12/09/19
Graças a ambos! Agradável e simples. ;)
genderbee 12/09/19
Para dois, tudo bem, para mais, uso para loops indiretos: for var in email_sender email_recipient email_subject email_attachement etc ; do printf -v "${var}" '%s' "$(grep -oP $var'=\K.*' webcheck-$category.cfg)"; doneNo entanto, isso falha nos critérios "simples".
Law29
3

Você pode usar a substituição de processo :

source <(sed -n '/# Main configuration./,/# Websites./p' webcheck-$category.cfg | sed '1,1d' | sed '$ d')
pLumo
fonte
0
#!/bin/bash

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

ou

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

Resultado:

[email protected] [email protected]

bac0n
fonte
-1

o bash read builtin lida bem com coisas como essa.

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

readlê linhas de stdin em variáveis. -d ''desativa a divisão de espaço em branco, exceto as novas linhas. -rdesativa \escapes.

cmdA < <(cmdB)funciona de maneira semelhante ao cmdB | O cmdA, exceto no antigo cmdA, é executado neste ~ shell, em vez de um subshell, necessário para que a leitura funcione conforme o esperado.

Evan Benn
fonte
1
Você pode alguma explicação sobre as diferentes partes da linha?
Simon Sudler
Isso é verdade, mas como é relevante para a pergunta feita onde o objetivo é ler de um arquivo var=value?
terdon 14/09/19