使用xargs运行多个命令

问题描述 投票:294回答:10
cat a.txt | xargs -I % echo %

在上面的示例中,xargs将echo %作为命令参数。但是在某些情况下,我需要多个命令而不是一个来处理参数。例如:

cat a.txt | xargs -I % {command1; command2; ... }

但是xargs不接受此形式。我知道的一个解决方案是,我可以定义一个函数来包装命令,但这不是管道,我不喜欢它。还有其他解决方案吗?

bash xargs
10个回答
424
投票
cat a.txt | xargs -d $'\n' sh -c 'for arg do command1 "$arg"; command2 "$arg"; ...; done' _

...或没有Useless Use Of cat

<a.txt xargs -d $'\n' sh -c 'for arg do command1 "$arg"; command2 "$arg"; ...; done' _

解释一些更好的要点:

  • 出于安全考虑,使用"$arg"而不是%(并且-I命令行中没有xargs)是:在sh的命令行参数列表中传递数据将其替换为代码可以防止数据可能包含的内容(例如$(rm -rf ~),尤其是恶意示例)作为代码执行。

  • 类似地,-d $'\n'的使用是GNU扩展名,它使xargs将输入文件的每一行都视为单独的数据项。必须使用此字符或-0(期望使用NUL而不是换行符)来防止xargs尝试对读取的流进行类似shell的(但与shell兼容的解析)解析。 (如果没有GNU xargs,则可以使用tr '\n' '\0' <a.txt | xargs -0 ...来获得不带-d的面向行的读取)。

  • _$0的占位符,因此xargs添加的其他数据值将变为$1并向前,这恰好是for循环迭代的默认值集。

2
投票
我当前为此的BKM是

bash


35
投票
使用GNU Parallel,您可以做:

24
投票
这是没有xargs或cat的另一种方法:

21
投票
您可以使用

16
投票
我要做的一件事是将.bashrc / .profile添加到此功能:

13
投票
我更喜欢允许空运行模式(无| sh)的样式:

12
投票
聚会晚了一点。

8
投票
对我来说另一种可行的解决方案是-

kubectl


7
投票
这似乎是最安全的版本。

cat a.txt | xargs -n 5 bash -c 'echo -n `date +%Y%m%d-%H%M%S:` ; echo " data: " $@; echo "data again: " $@' bash

© www.soinside.com 2019 - 2024. All rights reserved.