在一行中将参数传递给多个命令

在一行中将参数传递给多个命令

我希望能够在同一文件上在一行中运行多个命令。我目前这样做的方法是:

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

相关内容