有什么方法可以从命令输出中读取行吗?

有什么方法可以从命令输出中读取行吗?

我有一个预处理命令来输出文件

./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|ee < < (d < <(c < <(b < <(a))))

答案2

你可以使用bash流程替代:

while IFS= read -r line; do
  ./research.sh "$line" &
done < <(./preprocess.sh)

流程替代的一些优点:

  • 无需保存临时文件。
  • 更好的性能。从另一个进程读取通常比写入磁盘更快,然后读回。
  • 由于与参数和变量扩展、命令替换和算术扩展同时执行,因此节省了计算时间

相关内容