Bash读取行缓冲区溢出

时间:2013-02-27 17:29:40

标签: bash buffer-overflow tee

我有一个bash脚本,它从文件中读取行,然后用这些行做一些逻辑。

所以

while read line;
do
# some stuff
done < "$1"

在while循环体中,我将一个命令的输出传递给tee。 当此输出非常大(大约为100K)时,下一次读取读取操作将失败,并且while循环将在读取文件中的所有行之前终止。

为什么会这样?我不是一个bash专家,但似乎正在发生某种缓冲区溢出。如果是这样,我该如何纠正?

谢谢, -D

编辑: 所以有些澄清是有道理的。 $ 1是给bash脚本的第一个命令行参数,它与文件名相对应。我正在做的是将输入文件的每一行作为参数提供给另一个程序。我正在将该程序的stdout和stderr传递给| tee -a somefile

我提供输入的程序是非标准的。根据我正在阅读的文件行,该程序的输出可能非常大。

所以我正在做的一个更详细的例子是

while read line;
do
setSomeVar1
setSomeVar2
program --output="$setSomeVar1" -options "$line" 2>&1 | tee -a "$setSomeVar2"
done < "$1"

谢谢,

-D

2 个答案:

答案 0 :(得分:2)

如果循环体中的其他内容正在从标准输入读取,则可以让read从不同的文件描述符中获取其输入(3通常是免费的):

while read -u 3 line; do
...
done 3< "$1"

答案 1 :(得分:0)

我自己也遇到过同样的问题,如果这么多年后还有人在看这个的话。

# do some stuff 块中,无论您在其中运行的任何命令可能出于某种原因吸收标准输入,都添加一个 < /dev/null 以便您明确地使该命令不接受标准输入。这对我有用。