एक सबशेल के बिना बैश में एक कमांड के आउटपुट पर Iterate करें


9

मैं एक उप-शेल बनाने या एक अस्थायी फ़ाइल का उपयोग किए बिना एक कमांड के आउटपुट पर लूप करना चाहता हूं।

मेरी स्क्रिप्ट का आरंभिक संस्करण इस तरह दिखता था, लेकिन यह तब से काम नहीं करता है जब यह एक सबस्क्रिप्शन बनाता है, और exitकमांड मुख्य स्क्रिप्ट के बजाय सब्स्क्रिप्शन को समाप्त कर देता है जिसकी आवश्यकता होती है। यह नीति रूटिंग को कॉन्फ़िगर करने के लिए एक बहुत बड़ी स्क्रिप्ट का हिस्सा है, और यह निष्पादन को रोक देता है यदि यह एक ऐसी स्थिति का पता लगाता है जिससे रूटिंग विफल हो जाएगी।

sysctl -a 2>/dev/null | grep '\.rp_filter' | while read -r -a RPSTAT ; do

  if [[ "0" != "${RPSTAT[2]}" ]] ; then
    echo >&2 "RP Filter must be disabled on all interfaces!"
    echo >&2 "The RP filter feature is incompatible with policy routing"
    exit 1
  fi
done

तो सुझाए गए विकल्पों में से एक है उपसमूह से बचने के लिए इस तरह से एक कमांड का उपयोग करना।

while read BLAH ; do echo $BLAH; done </root/regularfile

तो यह मुझे लगता है कि मुझे इस तरह की कमांड का उपयोग करने में सक्षम होना चाहिए ताकि वह सब-सब्सक्रिप्शन से बच सके और फिर भी मुझे जो प्रोग्राम चाहिए उससे आउटपुट मिल सके।

while read BLAH ; do echo $BLAH; done <(sysctl -a 2>/dev/null | grep '\.rp_filter')

दुर्भाग्य से, उस कमांड का उपयोग करने से इस त्रुटि का परिणाम मिलता है।

-bash: syntax error near unexpected token `<(sysct ...

मैं वास्तव में भ्रमित हो जाता हूं क्योंकि यह काम करता है।

cat <(sysctl -a 2>/dev/null | grep '\.rp_filter')

मैं उस कमांड के आउटपुट को एक अस्थायी फ़ाइल में सहेज सकता था, और अस्थायी फ़ाइल पर रीडायरेक्ट का उपयोग कर सकता था, लेकिन मैं ऐसा करने से बचना चाहता था।

तो क्यों पुनर्निर्देशन मुझे एक त्रुटि दे रहा है, और क्या मेरे पास कोई अन्य विकल्प है तो एक अस्थायी फ़ाइल बना रहा है?


जवाबों:


13

तुम चूक गए <। होना चाहिए:

while read BLAH ; do echo $BLAH; done < <(sysctl -a 2>/dev/null | grep '\.rp_filter')

<(sysctl -a 2>/dev/null | grep '\.rp_filter')एक फाइल होने के बारे में सोचो ।


बहुत बहुत धन्यवाद। मेरे संपादन के लिए, मुझे एक आदमी पृष्ठ, सहायता, या वेब पेज, जो इस दस्तावेज़ को इंगित कर सकता है? इसके लिए खोज करने का प्रयास करने पर मुझे Google को कुछ भी उपयोगी बताने के लिए नहीं मिला।
झोरखेड़

2
Google "प्रक्रिया प्रतिस्थापन"। जैसे tldp.org/LDP/abs/html/abs-guide.html#PROCESS-SUB
dogbane

यह ध्यान दिया जाना चाहिए कि <() प्रतिस्थापन फ़ाइल डिस्क्रिप्टर का उपयोग करता है और कुछ ऑपरेटिंग सिस्टम पर अस्थायी रूप से अस्थायी फ़ाइलों का निर्माण और उपयोग करेंगे।
इविंडिस्क

@Zoredache: बस <(बाश मैनुअल में खोजें (यह "प्रक्रिया प्रतिस्थापन" के तहत है)।
गिल्स एसओ- बुराई को रोकना '

@ewindisch, यदि कोई उपकरण पारदर्शी रूप से एक अस्थायी उपकरण बनाता है जो ठीक है, तो मैं केवल मैन्युअल रूप से एक बनाना नहीं चाहता था, जब मुझे यकीन था कि मुझे इसकी आवश्यकता नहीं थी।
ज़ेडाचेचे

0

कुछ और विकल्पों के लिए अगर कोई भी यहाँ फिर से आता है ...

शेल के आधार पर, आप संभवतः set -o errexitमूल शेल से बाहर निकलने के लिए उपयोग कर सकते हैं जब एक कमांड (एक उपखंड सहित) गैर-शून्य को ifब्लॉक या जाल में फंसने के बिना बाहर निकलता है &&या ||, जैसे कि

/bin/false || echo "ignoring error"

या, यदि आपके पास उपलब्ध है, तो आपको किल और $ PPID पर्यावरण चर का उपयोग करके अभिभावक का सबस्क्रिप्शन संकेत मिल सकता है।

या आप एक फ़ंक्शन में ब्लॉक को स्थानांतरित कर सकते हैं और 0/1 लौटा सकते हैं (जबकि स्पष्ट रूप से ब्लॉक के बाद 0 वापस) और बस अपनी पाइपलाइन को पसंद करें sysctl | grep | function || exit। मुझे लगता है कि आप इनलाइन ब्लॉक में भी रिटर्न डाल सकते हैं, लेकिन फ़ंक्शन आपके मित्र हैं। ;)

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