cat a.txt | xargs -I % echo %
在上面的示例中,xargs将echo %
作为命令参数。但是在某些情况下,我需要多个命令而不是一个来处理参数。例如:
cat a.txt | xargs -I % {command1; command2; ... }
但是xargs不接受此形式。我知道的一个解决方案是,我可以定义一个函数来包装命令,但这不是管道,我不喜欢它。还有其他解决方案吗?
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
循环迭代的默认值集。 bash
| sh
)的样式:kubectl
cat a.txt | xargs -n 5 bash -c 'echo -n `date +%Y%m%d-%H%M%S:` ; echo " data: " $@; echo "data again: " $@' bash