¿Cómo ejecutar líneas provenientes de un resultado grep?

10

Tengo un archivo de texto con ciertas instrucciones de instalación, y sé que puedo buscar una ocurrencia única en el archivo. Por ejemplo, el archivo de texto tiene algo como:

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

En bash, ¿cómo puedo ejecutar las líneas después de un grep en el archivo? Algo como:

ejecutar resultado de "grep somedir INSTALLFILE"
ejecutar el resultado de "grep 'export PERL5LIB' INSTALLFILE"
719016
fuente
2
¿No es la ejecución automática de esta manera un poco peligrosa?
Faheem Mitha
2
@Faheem y @avilella: Más que un poquito, ¡bastante peligroso! Además, algo frágil.
Caleb

Respuestas:

4

Suposiciones

  • usted tiene control sobre este archivo y no está en peligro de código malicioso
  • desea establecer estas variables en su shell actual

Puede redirigir sus comandos a un archivo temporal y ejecutar eso:

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

O podrías evaluar los resultados

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

Actualizando una vieja respuesta. Lo que haría hoy es usar una sustitución de proceso:

source <(
    grep somedir INSTALLFILE
    grep 'export PERL5LIB' INSTALLFILE
)
Glenn Jackman
fuente
Tenga en cuenta que para source <(...), necesita bash 4 o superior. No funcionaba con versiones anteriores (aunque zsh estaba bien).
Stéphane Chazelas
11

Para evaluar las líneas en un proceso de shell separado:

grep somedir INSTALLFILE | sh

Para evaluar las líneas en el proceso de shell en ejecución:

eval "$(grep somedir INSTALLFILE)"
Gilles 'SO- deja de ser malvado'
fuente
+1 por ser el único en ver el bosque a través de los árboles. Por la presente borrando mi respuesta. @avilella: por conveniencia, puede usar -A 1o -B 1como indicadores en uno u otro de sus grepcorreos electrónicos para obtener ambas líneas con un grep y usarlo en cualquiera de las soluciones de @Gilles.
Caleb
Tenga en cuenta que en algunos sistemas shpuede haber un enlace simbólico a otro shell en lugar del que esperaba, por lo que los resultados podrían ser impredecibles. Para estar seguro, especifique el caparazón exacto que espera, por ejemplogrep somedir INSTALLFILE | bash
thdoan
-2

¿Ha considerado usar la función 'exec' de find como en:

find somedir -name INSTALLFILE -exec {}\;
zedman9991
fuente
Creo que el OP está buscando ejecutar los resultados que regresan de grom grep, no ejecutar todos los resultados que regresan de find.
Caleb