Bash读取行缓冲区溢出问题

4
我是一名有用的助手,可以为您翻译文本。
我有一个bash脚本,它从文件中读取行,然后对这些行进行一些逻辑处理。
因此,
while read line;
do
# some stuff
done < "$1"

在while循环体中,我正在将一个命令的输出传输到tee。当这个输出非常大,大约100K时,下一次调用read line将失败,并且在读取文件中的所有行之前,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

正确的工具才能完成好的工作,bash并不是最佳选择。 - n. m.
2
循环体内可能还有其它的代码正在读取标准输入,这意味着它正在从文件中抽取数据,而这些数据本应该被read命令处理。 - chepner
如果命令使用stdio并连接到终端,则每行都会被刷新。否则,请阅读有关stdbuf的信息此处 - Fredrik Pihl
@chepner,正如我之前所说,我不是Bash专家,但是| someCommand算不算从stdin发送呢?感谢您的帮助。 - zdevex
如果您不准确地发布您正在做的事情,我们无法猜测出问题所在。请发布您正在使用的代码。 - moebius_eye
显示剩余4条评论
2个回答

3

如果循环体中的其他内容正在从标准输入读取数据,您可以让read从不同的文件描述符中获取输入(通常情况下,3是空闲的):

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

考虑到缺乏细节,这是一个很好的猜测(尽管只是猜测而已!) - Fredrik Pihl
@Fredrik 我并不是故意缺乏细节的。我原以为我已经提供了所有相关的细节。我已经在上面的帖子中更新了额外的细节。还有其他什么细节会有帮助吗? - zdevex
唉,这并没有解决问题。在大量输出后,它仍然终止脚本。 - zdevex

1

我自己也遇到了同样的问题,如果有人在这么多年之后仍在关注这个问题。

# 做一些事情块中,无论你运行的那些命令是否会因某种原因汲取stdin,在其中添加一个< /dev/null,以便明确地使该命令不接受stdin。这对我有用。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接