我有一个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
答案 0 :(得分:2)
如果循环体中的其他内容正在从标准输入读取,则可以让read
从不同的文件描述符中获取其输入(3通常是免费的):
while read -u 3 line; do
...
done 3< "$1"
答案 1 :(得分:0)
我自己也遇到过同样的问题,如果这么多年后还有人在看这个的话。
在 # do some stuff
块中,无论您在其中运行的任何命令可能出于某种原因吸收标准输入,都添加一个 < /dev/null
以便您明确地使该命令不接受标准输入。这对我有用。