come eseguire le linee provenienti da un risultato grep?


10

Ho un file di testo con alcune istruzioni di installazione e so che posso eseguire grep per una ricorrenza unica nel file. Ad esempio, il file di testo ha qualcosa del tipo:

MYDIR = `find / home / user -name somedir`
export PERL5LIB = $ PERL5LIB: $ MYDIR

In bash, come posso eseguire le righe dopo un grep nel file? Qualcosa di simile a:

esegue il risultato da "grep somedir INSTALLFILE"
esegue il risultato da "grep 'export PERL5LIB' INSTALLFILE"

2
L'esecuzione automatica in questo modo non è un po 'pericolosa?
Faheem Mitha,

2
@Faheem e @avilella: più che un po 'adolescenziale, anzi piuttosto pericoloso! Inoltre, un po 'fragile.
Caleb,

Risposte:


4

ipotesi:

  • hai il controllo su questo file e non sei in pericolo di codice dannoso
  • vuoi impostare queste variabili come shell corrente

È possibile reindirizzare i comandi su un file temporaneo ed eseguire quello:

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

Oppure potresti valutare i risultati

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

Aggiornamento di una vecchia risposta. Quello che farei oggi è usare una sostituzione di processo:

source <(
    grep somedir INSTALLFILE
    grep 'export PERL5LIB' INSTALLFILE
)

Si noti che per source <(...), è necessario bash 4 o superiore. Non funzionava con le versioni precedenti (però zsh era OK).
Stéphane Chazelas,

11

Per valutare le linee in un processo di shell separato:

grep somedir INSTALLFILE | sh

Per valutare le linee nel processo di esecuzione della shell:

eval "$(grep somedir INSTALLFILE)"

+1 per essere l'unico a vedere la foresta attraverso gli alberi. Con la presente eliminando la mia risposta. @avilella: per comodità puoi usare -A 1o -B 1come flag su una o l'altra delle tue greps per recuperare entrambe le linee con un grep e usarlo in una delle soluzioni @Gilles.
Caleb,

Si noti che su alcuni sistemi shpotrebbe essere un collegamento simbolico a un'altra shell invece di quella che ci si aspettava, quindi i risultati potrebbero essere imprevedibili. Per sicurezza, specifica l'esatto guscio che ti aspetti, ad esgrep somedir INSTALLFILE | bash
Dal

-2

Hai considerato di utilizzare la funzione 'exec' di find come in:

find somedir -name INSTALLFILE -exec {}\;

Penso che l'OP stia cercando di eseguire i risultati che ritornano da grep grep, non dalla corsa di ogni risultato che ritorna da find.
Caleb,
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.