我正在循环一个大文件,在每一行上运行一些命令,当它们完成时,我希望将整个输出附加到文件中。
由于没有什么可以阻止我同时运行多个命令,因此我尝试在后台运行它&
。
它没有按预期工作,它只是在命令完成时将它们附加到文件中,而不是按照它们在子 shell 中出现的顺序
#!/bin/bash
while read -r line; do
(
echo -e "$line\n-----------------"
trivy image --severity CRITICAL $line
# or any other command that might take 1-2 seconds
echo "============="
) >> vulnerabilities.txt &
done <images.txt
我哪里错了?
最佳答案
考虑使用GNU Parallel来并行完成许多事情。对于您的情况:
parallel -k -a images.txt trivy image --severity CRITICAL > vulnerabilities.txt
-k
保持输出的顺序。添加 --bar
或 --eta
以获取进度报告。添加 --dry-run
来看看它实际上不做任何事情会做什么。添加 -j ...
来控制任意时间并行作业的数量 - 默认情况下,它将一次为每个 CPU 核心运行一个作业 - 所以它基本上会让所有核心保持忙碌状态,直到工作已经完成。
如果您想对每一行进行更多处理,您可以声明一个 bash 函数并以每一行作为参数调用该函数...参见 here .
关于Bash 子 shell 到文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70382679/