【问题标题】:Executing a file with one command per line with xargs使用 xargs 每行一个命令执行文件
【发布时间】:2016-08-11 16:43:52
【问题描述】:

我有一个文件,其中包含一系列命令,每行一个。例如:

./run_test_1.sh fileA ./run_test_1.sh fileB ./run_test_2.sh fileC

我想使用 xargs 并行运行这些。

【问题讨论】:

    标签: shell parallel-processing xargs


    【解决方案1】:

    试试这个:

    printf "%s\0" $(cat afile) | xargs -0 -P 3 -I xxx bash -c xxx
    

    xargs 将并行运行来自afile 的 3 个命令。

    命令或其选项中的特殊字符会破坏此解决方案。

    ----

    下面的版本看似安全,但随后afile中的所有命令都是按顺序执行的:

    printf "%s\0" "$(cat afile)" | xargs -0 -P 3 -I xxx bash -c xxx
    

    -P 3 在这里没用。

    【讨论】:

    • 谢谢,很好用。我不知道为什么我遇到了麻烦,我以为我试过了!这仅适用于我自己编写的脚本,所以我一定不要使用任何特殊字符。
    • @ChrisJefferson 该命令刚刚更新为更安全的版本
    • 这不是将整个文件作为一个“行”发送到xargs 吗?它将如何并行化?啊。我看到原来的“工作”,但编辑是错误的。
    • @EtanReisner 是的。所以这个printf "%s\0" "$(cat afile)" 发送整个文件。在测试中似乎是安全的,但是没有更多的并行执行(-P 3 没用)。如果在$(cat afile) 周围删除了 " 则存在并行性 AND 命令中的特殊字符会破坏它。
    • 对。我不相信 OP 想要的实际上是以安全的方式可行的。不适用于所有可能的行内容。 ...好吧,使用while IFS= read -r line; do bash -c "$line"; done < file 或类似的东西以安全的方式(假设初始命令是安全编写的)可能是可行的,但我必须更多地考虑它(或查找有关它的其他答案)。
    猜你喜欢
    • 2017-04-03
    • 2010-09-16
    • 2021-11-08
    • 2015-05-30
    • 1970-01-01
    • 1970-01-01
    • 2011-10-20
    相关资源
    最近更新 更多