2010-03-04 15 views
11

Próbuję zrobić coś takiegoCzytanie wielu linii w bashie bez tworzenia nowej podpowłoki?

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

Niestety to nie działa, ponieważ rura powoduje czasu, aby uruchomić w podpowłoce. Czy jest lepszy sposób to zrobić? Nie potrzebuję używać "czytaj", jeśli istnieje inne rozwiązanie.

Spojrzałem na Bash variable scope, który jest podobny, ale nie mogłem uzyskać niczego, co z niego działało.

+0

To jest http://mywiki.wooledge.org/BashFAQ/024 – tripleee

Odpowiedz

17

Jeśli naprawdę robisz coś, co jest uproszczone, nie potrzebujesz nawet pętli while read. Poniższa będzie działać:

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

Jeśli naprawdę trzeba zrobić pętlę, bo inne rzeczy dzieją się w pętli, można przekierować z podstawieniem <(commands) procesu:

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

(lista)? Czy nie nazywa się to substytucją procesową? http://tldp.org/LDP/abs/html/process-sub.html – pihentagy

2

potem nie używać rura i stracić grep

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