Чтение нескольких строк в bash без появления новой подоболочки?

Я пытаюсь сделать что-то вроде

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

К сожалению, это не сработает, так как труба заставляет время работать в подоболочке. Есть лучший способ сделать это? Мне не нужно использовать "читать", если есть другое решение.

Я просмотрел Bash область видимости переменных, которая похожа, но я не мог получить от нее ничего, что сработало.

Ответ 1

Если вы действительно делаете что-то упрощенное, вам даже не нужен цикл 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

тогда не используйте pipe и теряйте grep

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