¿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"

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
)

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)"

+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 {}\;

Creo que el OP está buscando ejecutar los resultados que regresan de grom grep, no ejecutar todos los resultados que regresan de find.
Caleb
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.