bir grep sonucundan gelen satırları nasıl yürütürüm?


10

Belirli yükleme talimatlarını içeren bir metin dosyası var ve dosyadaki benzersiz bir olay için grep yapabileceğimi biliyorum. Örneğin, metin dosyası şuna benzer:

MYDIR = `find / home / user -name somedir`
dışa aktar PERL5LIB = $ PERL5LIB: $ MYDIR

Bash'da, dosyadaki bir grep'ten sonra satırları nasıl yürütebilirim? Gibi bir şey:

"grep somedir INSTALLFILE" ile ilgili sonucu çalıştır
"grep 'dışa aktarma PERL5LIB' INSTALLFILE" sonucunu yürüt

2
Bu şekilde otomatik yürütme bir teensy biraz tehlikeli değil mi?
Faheem Mitha

2
@Faheem ve @avilella: Teensy bir parçadan daha fazlası, gerçekten tehlikeli! Ayrıca, biraz kırılgan.
Caleb

Yanıtlar:


4

Varsayımlar:

  • bu dosya üzerinde kontrolünüz var ve kötü amaçlı kod tehlikesi altında değilsiniz
  • bu değişkenleri geçerli kabuğunuza ayarlamak istiyorsunuz

Komutlarınızı geçici bir dosyaya yeniden yönlendirebilir ve yürütebilirsiniz:

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

Veya sonuçları değerlendirebilirsiniz

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

Eski bir cevabı güncelleme. Bugün yapacağım bir işlem ikamesi kullanmaktır:

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

Bunun için source <(...)bash 4 veya üstüne ihtiyacınız olduğunu unutmayın . Eski sürümleri ile çalışmadı (zsh olsa Tamam).
Stéphane Chazelas

11

Çizgileri ayrı bir kabuk işleminde değerlendirmek için:

grep somedir INSTALLFILE | sh

Çalışan kabuk işlemindeki satırları değerlendirmek için:

eval "$(grep somedir INSTALLFILE)"

Ormanı ağaçların arasından gören tek kişi olduğu için +1. Bu vesileyle cevabımı siliyorum. @avilella: kolaylık kullanabileceğiniz -A 1veya -B 1biri üzerinde bayraklar veya diğer şekilde greps o @Gilles çözümlerden birini bir grep ve kullanımı ile iki satırını getirmesi.
Caleb

Bazı sistemlerde sh, beklediğinizin yerine başka bir kabuğa bir sembolik bağlantı olabileceğini unutmayın , bu nedenle sonuçlar tahmin edilemeyebilir. Güvende olmak için, beklediğiniz grep somedir INSTALLFILE | bash
mermiyi

-2

Bul komutunun 'exec' özelliğini aşağıdaki gibi kullanmayı düşündünüz mü:

find somedir -name INSTALLFILE -exec {}\;

Bence OP bulmadan geri gelen her sonucu çalıştırmak değil, grom grep geri gelen sonuçları yürütmek için arıyor.
Caleb
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.