为什么你不在 bash 中阅读带有“for”的行?

Kyr*_*rol 7 bash readline

我读过使用“for”不是在 bash 中读取行的好方法。许多人说这充其量是笨拙和低效的,并且在很多情况下都失败了。

我想知道在 bash 中阅读行的最佳方式是什么。谢谢。

例如:

$ for i in $(<afile); do echo "$i"; done
Run Code Online (Sandbox Code Playgroud)

use*_*686 17

您正在谈论for line in $(cat file); do和类似的构造。这是:

  • 效率低下,因为 bash 必须产生一个子shell 并执行cat,将cat输出——整个文件——读入内存,解析它(这是最慢的部分),然后才迭代所有数据
  • 不可靠,因为 bash对数据执行分——它不仅会在换行符上进行拆分,还会在 $IFS 中的任何内容上进行拆分(空格、制表符...)

(如果使用$(<...)而不是$(cat ...),则在 Linux 上可以节省两毫秒,但所有其他缺点仍然存在。)

更好的选择是循环中使用readwhile

while read -r line; do
    echo "Input: $line"
done < myfile.txt
Run Code Online (Sandbox Code Playgroud)

或者从一个程序:

cat file1 file2 file3 |
while read -r line; do
    echo "Input: $line"
done
Run Code Online (Sandbox Code Playgroud)

这只读取需要的量,不执行不必要的处理,但允许自定义字段拆分,并且在大文件上速度快许多倍,资源需求更少。

如果您尝试使用 的输出find,则应使用相同的模式:

find . -name "foo" -type f -print0 | while read -r -d '' file; do
    echo "File: $file"
done
Run Code Online (Sandbox Code Playgroud)

也可以看看: