2010-03-04 30 views
11

我試圖做類似在bash中讀取多行而不產生新的子shell?

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

不幸的是這不起作用,因爲管道引起,而在子shell中運行。有一個更好的方法嗎?如果還有其他解決方案,我不需要使用「閱讀」。

我看過Bash variable scope這是相似的,但我無法從它得到任何工作。

+0

這是http://mywiki.wooledge.org/BashFAQ/024 – tripleee 2016-07-19 17:42:11

回答

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 2013-06-10 07:23:47

2

那麼就不要使用管,而失去的grep

var=1 
while read line 
do 
    case "$line" in 
    *foo*) var=1 
    esac 
done <"file" 
echo "var after: $var"