shell脚本中管道重定向read的问题

zerray | 六月 12th, 2010 - 15:19

同学问了这样一个问题:

#! /bin/bash

declare -a lines
i=0
cat /proc/net/netstat | while read line
do
    lines[$i]=${line}
    i=$((i+1))
done

echo ${lines[0]}

最终了输出结果${lines[0]}是空
试了一下果然如此
经过一番尝试,发现是使用了管道的问题,改为

#! /bin/bash

declare -a lines
i=0
while read line
do
    lines[$i]=${line}
    i=$((i+1))
done < /proc/net/netstat

echo ${lines[0]}

就没问题了
同样,如果管道前的cat换成ls、echo等,也会有相同问题
似乎是使用了管道后,变量的作用域发生了改变

关于这点在《高级bash脚本编程指南》上找到了相关提示

echo的输出通过管道传 递给read命 令可能会产生不可预料的结果. 在这种情况下, read命令的行为就好像它在子shell中运行一样. 可以使用set命 令来代替(就好像例子 11-17一样).

不过也没解释为什么,feature or bug?