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 循环:
- 第一种情况:
- 将文件连接到标准输入
- 一直读到换行
- 循环(阅读下一行)
- 断开文件
- 第二种情况:
- 将文件连接到标准输入
- 一直读到换行
- 断开文件
- 循环(重新连接文件,读取一行,断开文件)
command <filename
打开 filename
,运行 command
,其标准输入连接到刚刚打开的文件句柄,然后关闭文件句柄。
所以当您执行 while condition; do ... done <filename
时,整个循环就是 command
:它在循环之前打开文件一次,直到循环结束才关闭文件。这意味着循环中的所有读取语句都连续应用于同一个打开的文件,并且它读取文件的所有行。
但是当您执行 while read < filename; do ... done
时,command
就是 read
。所以它打开文件,运行 read
,然后关闭文件……每次。您最终只是一遍又一遍地阅读文件的第一行。
打印文件行的代码可能如下所示
while read i; do
echo $i
done < ${filename}
但是为什么不能这样写呢?解释一下。
while read i < ${filename}; do
echo $i
done
你可以那样写,但它总是读取第一行。
像这样思考 while 循环:
- 第一种情况:
- 将文件连接到标准输入
- 一直读到换行
- 循环(阅读下一行)
- 断开文件
- 第二种情况:
- 将文件连接到标准输入
- 一直读到换行
- 断开文件
- 循环(重新连接文件,读取一行,断开文件)
command <filename
打开 filename
,运行 command
,其标准输入连接到刚刚打开的文件句柄,然后关闭文件句柄。
所以当您执行 while condition; do ... done <filename
时,整个循环就是 command
:它在循环之前打开文件一次,直到循环结束才关闭文件。这意味着循环中的所有读取语句都连续应用于同一个打开的文件,并且它读取文件的所有行。
但是当您执行 while read < filename; do ... done
时,command
就是 read
。所以它打开文件,运行 read
,然后关闭文件……每次。您最终只是一遍又一遍地阅读文件的第一行。