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


10

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

commandA file && commandB file && perl -ne '...' file

我的直觉告诉我,应该有一种方法只能提供一次filename参数,然后通过xargs或类似方式将其同时传递给两个命令:

find file | xargs commandA && xargs commandB && xargs perl -ne '...'

当我尝试此操作时,仅第一个命令运行。我该如何实现自己的目标?

Answers:


12

您可以为此定义一个局部变量:

f=file; commandA $f && commandB $f && ...

您也可以执行所有无条件(替换&&;)或并联(替换&&&)。

另外,您还可以使用shell历史记录扩展来引用以前的参数:

commandA file && commandB !:1 && ...

不完全是我的想法,但是是一个有趣的选择。
Zaid 2010年

这个答案有什么问题?
克里斯,2010年

这真是太酷了!有没有不定义新变量的方法?
用户

@user,我添加了一个替代方法。
maxschlepzig

8

对于具有进程替换的Bash,Korn和Z等shell,可以执行以下操作:

find file | tee >(xargs commandA) >(xargs commandB) >(xargs perl -ne '...')

2

您可以使用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

用它来获取目录中包含的所有文件的列表,这些目录的名称类似于“枚举”: find . -name "*enums*" | xargs -i echo -e echo {}\; ls -lh {}\; echo -e '\n\n' | bash
Matt Lachman

1

我自己不会为此投票。这是愚蠢且危险的,但是仅出于列出执行此操作的方式的目的,有:

for cmd in "commandA" "commandB" "perl -ne '...'" ; do eval $cmd file ; done

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.