कैसे एक grep परिणाम से आने वाली लाइनों को निष्पादित करने के लिए?


10

मुझे कुछ इंस्टॉलेशन निर्देशों के साथ एक टेक्स्ट फ़ाइल मिली है, और मुझे पता है कि मैं फ़ाइल में एक अद्वितीय घटना के लिए संक्षिप्त कर सकता हूं। उदाहरण के लिए, पाठ फ़ाइल में कुछ ऐसा है:

MYDIR = `खोज / घर / उपयोगकर्ता-नाम somedir`
निर्यात PERL5LIB = $ PERL5LIB: $ MYDIR

बैश में, मैं फ़ाइल में एक grep के बाद लाइनों को कैसे निष्पादित कर सकता हूं? कुछ इस तरह:

"grep somedir INSTALLFILE" से परिणाम निष्पादित करें
"grep 'निर्यात PERL5LIB' INSTALLFILE" से परिणाम निष्पादित करें

2
इस फैशन में स्वचालित निष्पादन एक खतरनाक सा खतरनाक नहीं है?
फहीम मीठा

2
@ फहीम और @ शैलेला: वास्तव में खतरनाक नहीं बल्कि एक किशोर से अधिक! इसके अलावा, कुछ नाजुक।
कालेब

जवाबों:


4

मान्यताओं:

  • आपके पास इस फ़ाइल पर नियंत्रण है और दुर्भावनापूर्ण कोड के खतरे में नहीं हैं
  • आप इन चरों को अपना वर्तमान शेल सेट करना चाहते हैं

आप अपने आदेशों को एक अस्थायी फ़ाइल पर पुनर्निर्देशित कर सकते हैं और उस पर अमल कर सकते हैं:

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

या आप परिणामों का मूल्यांकन कर सकते हैं

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

एक पुराने उत्तर को अद्यतन करना। मैं आज क्या करूँगा एक प्रक्रिया प्रतिस्थापन का उपयोग करें:

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

ध्यान दें कि source <(...)आपको 4 या उससे ऊपर के बैश की जरूरत है। यह पुराने संस्करणों के साथ काम नहीं करता था (zsh हालांकि ठीक था)।
स्टीफन चेजेलस

11

एक अलग शेल प्रक्रिया में लाइनों का मूल्यांकन करने के लिए:

grep somedir INSTALLFILE | sh

रनिंग शेल प्रक्रिया में लाइनों का मूल्यांकन करने के लिए:

eval "$(grep somedir INSTALLFILE)"

पेड़ों के माध्यम से जंगल को देखने के लिए केवल एक ही होने के लिए +1। इस प्रकार मेरा उत्तर हटा दिया गया। @avilella: सुविधा के लिए आप एक या एक के झंडे के रूप में उपयोग कर सकते हैं -A 1या -B 1एक या दूसरे के झंडे को grepएक grep के साथ दोनों लाइनों को लाने के लिए और @Gilles समाधानों में से किसी एक का उपयोग कर सकते हैं।
कालेब

ध्यान दें कि कुछ सिस्टम पर shआपके द्वारा अपेक्षित एक के बजाय किसी अन्य शेल के लिए सिमलिंक हो सकता है, इसलिए परिणाम अप्रत्याशित हो सकते हैं। सुरक्षित होने के लिए, विशिष्ट शेल जिसकी आप अपेक्षा कर रहे हैं, उदाहरण के लिएgrep somedir INSTALLFILE | bash
2

-2

क्या आपने खोज के 'निष्पादन' सुविधा का उपयोग करने पर विचार किया है:

find somedir -name INSTALLFILE -exec {}\;

मुझे लगता है कि ओपी उन परिणामों को निष्पादित करना चाह रहा है जो वापस ग्रोम जीआरपी पर आते हैं, न कि हर परिणाम जो खोज से वापस आता है।
कालेब
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.