2013-02-27 118 views
3

我有一个bash脚本从文件中读取行,然后用这些行做一些逻辑。Bash读取行缓冲区溢出

所以

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

在while循环我一个管道命令的输出tee的身体。 当这个输出非常大时,在100K的数量级上,下一次读取线路的调用失败,while循环在读取文件中的所有行之前终止。

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

感谢, -D

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

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

所以我在做什么更详细的例子是

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

感谢,

-D

+0

什么是'$ 1'?你到底在做什么? – chepner 2013-02-27 17:32:26

+0

这个工作的正确工具...... bash是不是。 – 2013-02-27 17:33:23

+2

循环体中的其他内容也有可能从标准输入中读取,这意味着它正在从用于“读取”命令的文件中抽取数据。 – chepner 2013-02-27 17:33:31

回答

2

如果什么都在循环体是从标准输入读,你可以有read从不同的文件描述符中获得输入(3通常是空闲的):

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

猜测和任何考虑缺乏细节一样好(虽然猜得不错!) – 2013-02-27 17:41:38

+0

我会给这个镜头,谢谢。 – zdevex 2013-02-27 20:51:32

+0

@Fredrik我并不是故意缺乏细节。我原以为我已经给了所有相关的。我更新了上面的帖子,提供了更多细节。有没有其他细节会有帮助? – zdevex 2013-02-27 20:52:19