我有一个预处理命令来输出文件
./preprocess.sh > preprocessed_file
将preprocessed_file
像这样使用
while read line
do
./research.sh $line &
done < preprocessed_file
rm -f preprocessed_file
有没有办法将输出定向到该while read line
部分而不是输出到 preprocessed_file?我认为除了使用这个 temp 之外应该有更好的方法preprocessed_file
。
答案1
是的!您可以使用过程管道|
。
./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))))
答案2
你可以使用bash流程替代:
while IFS= read -r line; do
./research.sh "$line" &
done < <(./preprocess.sh)
流程替代的一些优点:
- 无需保存临时文件。
- 更好的性能。从另一个进程读取通常比写入磁盘更快,然后读回。
- 由于与参数和变量扩展、命令替换和算术扩展同时执行,因此节省了计算时间