como executar linhas provenientes de um resultado grep?

10

Eu tenho um arquivo de texto com determinadas instruções de instalação e sei que posso receber por uma ocorrência única no arquivo. Por exemplo, o arquivo de texto tem algo como:

MYDIR = `find / home / nome do usuário somedir`
exportar PERL5LIB = $ PERL5LIB: $ MYDIR

No bash, como posso executar as linhas após um grep no arquivo? Algo como:

executar resultado de "grep somedir INSTALLFILE"
executar resultado de "grep 'export PERL5LIB' INSTALLFILE"
719016
fonte
2
A execução automática dessa maneira não é um pouquinho perigosa?
Faheem Mitha
2
@Faheem e @avilella: Mais do que um pouquinho, bastante perigoso mesmo! Além disso, um pouco frágil.
Caleb

Respostas:

4

Premissas:

  • você tem controle sobre esse arquivo e não corre o risco de código malicioso
  • você deseja definir essas variáveis ​​em seu shell atual

Você pode redirecionar seus comandos para um arquivo temporário e executar o seguinte:

tmp=$(mktemp)
{
    grep somedir INSTALLFILE
    grep 'export PERL5LIB' INSTALLFILE
} > "$tmp"
. "$tmp"

Ou você pode avaliar os resultados

eval "$(grep somedir INSTALLFILE)"
eval "$(grep 'export PERL5LIB' INSTALLFILE)"

Atualizando uma resposta antiga. O que eu faria hoje é usar uma substituição de processo:

source <(
    grep somedir INSTALLFILE
    grep 'export PERL5LIB' INSTALLFILE
)
Glenn Jackman
fonte
Observe que source <(...), para , você precisa do bash 4 ou superior. Não funcionou com versões mais antigas (embora o zsh estivesse OK).
Stéphane Chazelas
11

Para avaliar as linhas em um processo de shell separado:

grep somedir INSTALLFILE | sh

Para avaliar as linhas no processo do shell em execução:

eval "$(grep somedir INSTALLFILE)"
Gilles 'SO- parar de ser mau'
fonte
+1 por ser o único a ver a floresta através das árvores. Excluindo minha resposta. @avilella: por conveniência, você pode usar -A 1ou -B 1como sinalizadores em um ou outro de seus greps para buscar as duas linhas com um grep e usá-lo em qualquer uma das soluções @Gilles.
Caleb
Observe que em alguns sistemas shpode haver um link simbólico para outro shell em vez daquele que você esperava, portanto, os resultados podem ser imprevisíveis. Para ser seguro, específico exatamente o shell que você está esperando, por exemplogrep somedir INSTALLFILE | bash
thdoan
-2

Você já pensou em usar o recurso 'exec' de find como em:

find somedir -name INSTALLFILE -exec {}\;
zedman9991
fonte
Eu acho que o OP está olhando para executar os resultados que retornam grom grep, e não executar todos os resultados que retornam do find.
Caleb