Bash 子 shell 到文件

标签 bash shell subshell

我正在循环一个大文件,在每一行上运行一些命令,当它们完成时,我希望将整个输出附加到文件中。

由于没有什么可以阻止我同时运行多个命令,因此我尝试在后台运行它&

它没有按预期工作,它只是在命令完成时将它们附加到文件中,而不是按照它们在子 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/

相关文章:

c# - Mac 和 Linux 上类似 Windows 的 shell 扩展

shell - 在脚本和子 shell 中捕获信号

bash - 子shell中使用的"basename"返回"command not found"

用于监视远程端口并在不成功时启动脚本的 Linux 脚本

linux - 查找仅包含零大小文件的目录

linux - 如何检查bash脚本中$1是否包含特殊字符?

bash - 使用 Here Document 通过 ssh 调用子 shell $() 执行 bash 命令

php - 如何在可访问 php 解释器的情况下在 Linux 服务器计算机上安排任务?

linux - 如何在 ssh linux 中运行多个命令

linux - 如何通过读取多值分隔文件写入单值行