Answers:
您可以使用bash 进程替换:
while IFS= read -r line; do
./research.sh "$line" &
done < <(./preprocess.sh)
流程替换的一些优点:
<(...)是语法的一部分。
read读取时必须一次读取一个字节,但它可以通过读取较大的块来优化内容,并在从常规文件读取时向后查找。最好是尽可能地while read完全避免循环。另请注意,您需要IFS= read -r line将该行读入$line。并且$line在此处不加引号(调用split + glob运算符)可能没有任何意义。
read内置的Shell每次从管道读取时都会读取一个字符(不管管道另一端的内容如何,无论如何read也无法知道),这就是while read循环非常慢的原因之一。
是! 您可以使用过程管道|。
./preprocess.sh |
while IFS= read -r line
do
./research.sh "$line" &
done
过程管道将一个过程的标准输出(stdout)传递到下一个过程的标准输入(stdin)。
您可以选择在a后面放置换行符|,并将命令扩展到下一行。
注意:a|b等同于b < <(a),但没有魔幻文件,并且可读性更高,尤其是当管道变长时。
a|b|c 相当于 c < <(b < <(a))
和
a|b|c|d|e 是 e < < (d < <(c < <(b < <(a))))
$line放在双引号中比较安全(例如,在脚本中./research.sh "$line" &)。
research.sh与命令行参数数组一起使用并且$line例如为“ one two”,并且第一个参数为“ one”,第二个参数“ two”,则使用引号$line将使其变为不可能,相反,第一个参数为“一个二”,不会再有第二个……
a|b相当于b < <(a) ”-接近,但不完全相同。在管道版本中,管道的两端都在子外壳程序中运行,而在进程替代版本中,只有替换的进程在子a外壳程序中运行,但是在当前执行的外壳程序级别的范围内运行。这对设置的变量范围具有重要意义a