我希望能够在同一文件上在一行中运行多个命令。我目前这样做的方法是:
commandA file && commandB file && perl -ne '...' file
我的直觉告诉我,应该有一种方法只提供一次文件名参数,并通过xargs
或类似的方式将其同时传输到两个命令:
find file | xargs commandA && xargs commandB && xargs perl -ne '...'
当我尝试此操作时,仅运行第一个命令。我怎样才能实现我想做的事?
答案1
您可以为此定义一个局部变量:
f=file; commandA $f && commandB $f && ...
您还可以无条件执行(替换&&
为;
)或并行执行(替换&&
为&
)。
或者,您还可以使用 shell 历史扩展来引用以前的参数:
commandA file && commandB !:1 && ...
答案2
对于 Bash、Korn 和 Z 等具有进程替换的 shell,您可以执行以下操作:
find file | tee >(xargs commandA) >(xargs commandB) >(xargs perl -ne '...')
答案3
您可以使用 xargs 构建命令行,例如:
echo file | xargs -i -- echo ls -l {}\; wc -l {}
只需将上面的内容通过管道输入 bash 即可运行它:
echo file | xargs -i -- echo ls -l {}\; wc -l {} | bash
将示例扩展到当前目录中的所有 *.c 文件(转义LS此处防止任何 shell 别名替换):
\ls -1 *.c | xargs -i -- echo ls -l {}\; wc -l {} | bash
答案4
我自己不会投票支持这一点。这是愚蠢和危险的,但只是为了列出执行此操作的方法,有:
for cmd in "commandA" "commandB" "perl -ne '...'" ; do eval $cmd file ; done