Reading multiple lines in bash without spawning a new subshell?
I'm trying to do something like
var=0
grep "foo" bar | while read line; do
var=1
done
Unfortunately this doesn't work since the pipe causes the while to run in a subshell. Is there a better way to do this? I don't need to use "read" if there's another solution.
I've looked at Bas开发者_Go百科h variable scope which is similar, but I couldn't get anything that worked from it.
If you really are doing something that simplistic, you don't even need the while read
loop. The following would work:
VAR=0
grep "foo" bar && VAR=1
# ...
If you really do need the loop, because other things are happening in the loop, you can redirect from a <( commands )
process substitution:
VAR=0
while read line ; do
VAR=1
# do other stuff
done < <(grep "foo" bar)
then don't use pipe ,and lose the grep
var=1
while read line
do
case "$line" in
*foo* ) var=1
esac
done <"file"
echo "var after: $var"
精彩评论