Wie führe ich Zeilen aus, die aus einem Grep-Ergebnis stammen?


10

Ich habe eine Textdatei mit bestimmten Installationsanweisungen und weiß, dass ich nach einem eindeutigen Vorkommen in der Datei suchen kann. Die Textdatei enthält beispielsweise Folgendes:

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

Wie kann ich in bash die Zeilen nach einem grep in der Datei ausführen? Etwas wie:

Ergebnis von "grep somedir INSTALLFILE" ausführen
Ergebnis von "grep 'export PERL5LIB' INSTALLFILE" ausführen

2
Ist die automatische Ausführung auf diese Weise nicht ein bisschen gefährlich?
Faheem Mitha

2
@Faheem und @avilella: Mehr als ein kleines bisschen, in der Tat ziemlich gefährlich! Auch etwas zerbrechlich.
Caleb

Antworten:


4

Annahmen:

  • Sie haben die Kontrolle über diese Datei und sind nicht in der Gefahr von Schadcode
  • Sie möchten diese Variablen Ihrer aktuellen Shell zuordnen

Sie können Ihre Befehle in eine temporäre Datei umleiten und Folgendes ausführen:

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

Oder Sie könnten die Ergebnisse auswerten

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

Aktualisieren einer alten Antwort. Was ich heute tun würde, ist eine Prozessersetzung:

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

Beachten Sie, dass Sie für source <(...)Bash 4 oder höher benötigen. Es funktionierte nicht mit älteren Versionen (zsh war allerdings in Ordnung).
Stéphane Chazelas

11

So bewerten Sie die Zeilen in einem separaten Shell-Prozess:

grep somedir INSTALLFILE | sh

So bewerten Sie die Zeilen im laufenden Shell-Prozess:

eval "$(grep somedir INSTALLFILE)"

+1 für die einzige Person, die den Wald durch die Bäume sieht. Hiermit lösche ich meine Antwort. @avilella: Der Einfachheit halber können Sie -A 1oder -B 1als Flags auf dem einen oder anderen Ihrer greps beide Zeilen mit einem Grep abrufen und diese in einer der @ Gilles-Lösungen verwenden.
Caleb

Beachten Sie, dass auf einigen Systemen shmöglicherweise ein Symlink zu einer anderen Shell anstelle der erwarteten vorhanden ist, sodass die Ergebnisse möglicherweise nicht vorhersehbar sind. Um sicher zu gehen, geben Sie genau die Shell an, die Sie erwarten, z. B.grep somedir INSTALLFILE | bash
10.

-2

Haben Sie darüber nachgedacht, die 'exec'-Funktion von find wie folgt zu verwenden:

find somedir -name INSTALLFILE -exec {}\;

Ich denke, das OP versucht, die Ergebnisse auszuführen, die von grep zurückkommen, und nicht jedes Ergebnis, das von find zurückkommt.
Caleb
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.