4

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

所以

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

在 while 循环的主体中,我将一个命令的输出通过管道传输到tee. 当这个输出非常大时,大约 100K,下一次调用 read line 失败,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

4

2 回答 2

3

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

while read -u 3 line; do
...
done 3< "$1"
于 2013-02-27T17:40:19.880 回答
0

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

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

于 2021-06-21T06:05:53.460 回答