bagaimana cara mengeksekusi baris yang berasal dari hasil grep?


10

Saya punya file teks dengan instruksi instalasi tertentu, dan saya tahu saya bisa mencari kejadian unik dalam file tersebut. Misalnya, file teks memiliki sesuatu seperti:

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

Dalam bash, bagaimana saya bisa menjalankan baris setelah grep dalam file? Sesuatu seperti:

jalankan hasil dari "grep somedir INSTALLFILE"
jalankan hasil dari "grep 'export PERL5LIB' INSTALLFILE"

2
Bukankah eksekusi otomatis dengan cara ini agak berbahaya?
Faheem Mitha

2
@Faheem dan @avilella: Lebih dari sedikit kekecilan, agak berbahaya! Juga agak rapuh.
Caleb

Jawaban:


4

Asumsi:

  • Anda memiliki kendali atas file ini dan tidak dalam bahaya kode berbahaya
  • Anda ingin mengatur variabel-variabel ini shell Anda saat ini

Anda bisa mengarahkan perintah Anda ke file temp dan menjalankannya:

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

Atau Anda bisa mengevaluasi hasilnya

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

Memperbarui jawaban lama. Apa yang akan saya lakukan hari ini adalah menggunakan proses substitusi:

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

Perhatikan bahwa untuk source <(...), Anda memerlukan bash 4 atau lebih tinggi. Itu tidak bekerja dengan versi yang lebih lama (zsh OK).
Stéphane Chazelas

11

Untuk mengevaluasi garis-garis dalam proses shell yang terpisah:

grep somedir INSTALLFILE | sh

Untuk mengevaluasi garis-garis dalam proses shell yang berjalan:

eval "$(grep somedir INSTALLFILE)"

+1 karena menjadi satu-satunya yang melihat hutan melalui pepohonan. Dengan ini menghapus jawaban saya. @avilella: untuk kenyamanan Anda dapat menggunakan -A 1atau -B 1sebagai flag pada satu atau yang lainnya grepuntuk mengambil kedua baris dengan satu grep dan menggunakannya dalam salah satu dari solusi @Gilles.
Caleb

Perhatikan bahwa pada beberapa sistem shmungkin merupakan symlink ke shell lain dan bukan yang Anda harapkan, sehingga hasilnya bisa tidak dapat diprediksi. Agar aman, spesifikkan shell yang tepat yang Anda harapkan, misalnyagrep somedir INSTALLFILE | bash
thdoan

-2

Sudahkah Anda mempertimbangkan untuk menggunakan fitur 'exec' find seperti pada:

find somedir -name INSTALLFILE -exec {}\;

Saya pikir OP mencari untuk mengeksekusi hasil yang kembali grom grep, bukan menjalankan setiap hasil yang kembali dari find.
Caleb
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.