2010-03-04 8 views
11

मैं दुर्भाग्य से इस के बाद से पाइप एक subshell में चलाने के लिए है, जबकि का कारण बनता है काम नहीं करता है की तरहएक नया सबहेल पैदा किए बिना बैश में एकाधिक लाइनें पढ़ रहे हैं?

var=0 
grep "foo" bar | while read line; do 
    var=1 
done 

कुछ करने के लिए कोशिश कर रहा हूँ। क्या ऐसा करने के लिए इससे अच्छा तरीका है? अगर कोई दूसरा समाधान है तो मुझे "पढ़ने" का उपयोग करने की आवश्यकता नहीं है।

मैंने Bash variable scope पर देखा है जो समान है, लेकिन मुझे इससे कुछ भी नहीं मिला।

+0

यह वह जगह है http://mywiki.wooledge.org/BashFAQ/024 – tripleee

उत्तर

17

यदि आप वास्तव में कुछ सरल कर रहे हैं, तो आपको while read लूप की भी आवश्यकता नहीं है। निम्नलिखित काम करेगा:

VAR=0 
grep "foo" bar && VAR=1 
# ... 

तुम सच में, पाश की जरूरत है क्योंकि अन्य बातों के पाश में हो रही हैं करते हैं, आप एक <(commands) प्रक्रिया प्रतिस्थापन से अनुप्रेषित कर सकते हैं:

VAR=0 
while read line ; do 
    VAR=1 
    # do other stuff 
done < <(grep "foo" bar) 
+2

(सूची) खो? क्या इसे प्रक्रिया प्रतिस्थापन नहीं कहा जाता है? http://tldp.org/LDP/abs/html/process-sub.html – pihentagy

2

तो उपयोग नहीं करते पाइप, और ग्रेप

var=1 
while read line 
do 
    case "$line" in 
    *foo*) var=1 
    esac 
done <"file" 
echo "var after: $var" 
संबंधित मुद्दे