comment exécuter des lignes provenant d'un résultat grep?


10

J'ai un fichier texte avec certaines instructions d'installation, et je sais que je peux rechercher une occurrence unique dans le fichier. Par exemple, le fichier texte a quelque chose comme:

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

En bash, comment puis-je exécuter les lignes après une grep dans le fichier? Quelque chose comme:

exécuter le résultat de "grep somedir INSTALLFILE"
exécuter le résultat de "grep 'export PERL5LIB' INSTALLFILE"

2
L'exécution automatique de cette manière n'est-elle pas un peu adolescente dangereuse?
Faheem Mitha

2
@Faheem et @avilella: Plus qu'un peu d'adolescent, plutôt dangereux en effet! Aussi, un peu fragile.
Caleb

Réponses:


4

Hypothèses:

  • vous avez le contrôle sur ce fichier et vous n'êtes pas en danger de code malveillant
  • vous voulez définir ces variables votre shell actuel

Vous pouvez rediriger vos commandes vers un fichier temporaire et l'exécuter:

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

Ou vous pouvez évaluer les résultats

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

Mise à jour d'une ancienne réponse. Ce que je ferais aujourd'hui, c'est utiliser une substitution de processus:

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

Notez que pour source <(...), vous avez besoin de bash 4 ou supérieur. Cela ne fonctionnait pas avec les anciennes versions (zsh était OK cependant).
Stéphane Chazelas

11

Pour évaluer les lignes dans un processus shell séparé:

grep somedir INSTALLFILE | sh

Pour évaluer les lignes dans le processus shell en cours d'exécution:

eval "$(grep somedir INSTALLFILE)"

+1 pour être le seul à voir la forêt à travers les arbres. Supprimant par la présente ma réponse. @avilella: pour plus de commodité, vous pouvez utiliser -A 1ou -B 1comme indicateurs sur l'un ou l'autre de vos greps pour récupérer les deux lignes avec un grep et l'utiliser dans l'une des solutions @Gilles.
Caleb

Notez que sur certains systèmes, il shpeut y avoir un lien symbolique vers un autre shell au lieu de celui que vous attendiez, donc les résultats peuvent être imprévisibles. Pour être sûr, spécifiez le shell exact que vous attendez, par exemplegrep somedir INSTALLFILE | bash
thdoan

-2

Avez-vous envisagé d'utiliser la fonction 'exec' de find comme dans:

find somedir -name INSTALLFILE -exec {}\;

Je pense que l'OP cherche à exécuter les résultats qui reviennent grom grep, pas la course à tous les résultats qui reviennent de trouver.
Caleb
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.