【问题标题】:I/O redirection in a while loop循环中的 I/O 重定向
【发布时间】:2020-03-08 19:51:47
【问题描述】:

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

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

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

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

【问题讨论】:

  • &lt; ${filename} 在任一示例中都是重定向,而不是您的主题/标题所暗示的进程替换。但我无法回答你的问题,这似乎是可能的,但可能是关于启动以处理while 循环的子进程。祝你好运。
  • 当你尝试时会发生什么?
  • @larsks 还没试过。但答案已经解释了一切。
  • @shellter :) 抱歉打错了。

标签: bash loops sh io-redirection


【解决方案1】:

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

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

但是当你使用while read &lt; filename; do ... done 时,command 就是read。所以它会打开文件,运行read,然后每次都关闭文件。你最终只是一遍又一遍地阅读文件的第一行。

【讨论】:

    【解决方案2】:

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

    想想这样的while循环:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-10-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-26
      相关资源
      最近更新 更多