I/O while 循环中的重定向

I/O redirection in a while loop

打印文件行的代码可能如下所示

while read i; do 
    echo $i
done < ${filename}

但是为什么不能这样写呢?解释一下。

while read i < ${filename}; do 
    echo $i
done 

可以那样写,但它总是读取第一行。

像这样思考 while 循环:

  1. 第一种情况:
    1. 将文件连接到标准输入
    2. 一直读到换行
    3. 循环(阅读下一行)
    4. 断开文件
  2. 第二种情况:
    1. 将文件连接到标准输入
    2. 一直读到换行
    3. 断开文件
    4. 循环(重新连接文件,读取一行,断开文件)

command <filename 打开 filename,运行 command,其标准输入连接到刚刚打开的文件句柄,然后关闭文件句柄。

所以当您执行 while condition; do ... done <filename 时,整个循环就是 command:它在循环之前打开文件一次,直到循环结束才关闭文件。这意味着循环中的所有读取语句都连续应用于同一个打开的文件,并且它读取文件的所有行。

但是当您执行 while read < filename; do ... done 时,command 就是 read。所以它打开文件,运行 read,然后关闭文件……每次。您最终只是一遍又一遍地阅读文件的第一行。