Unix:运行2个从管道输入的命令?

sms*_*169 5 unix pipe

更新:感谢您的回答.正如我所说,我的q只是我的用例的翻译.让我详细了解我想要实现的目标.在我的开发环境中,我们使用"ade"作为我们的版本控制系统,我想要做的是:

ade describetrans | awk '/myapps/{ print $2 }' | sort -fr | xargs -iF ade unbranch F 
Run Code Online (Sandbox Code Playgroud)

现在,每次运行unbranch命令时,都会检出一个新的文件/目录.所以我需要在所有的unbranch命令之后运行ade checkin -all.所以我需要类似的东西

"pre part till sort" | xargs -iF (ade unbranch + ade checkin -all) 
Run Code Online (Sandbox Code Playgroud)

有什么方法可以在管道上运行2个命令?

谢谢

原问提问:

我可以将我的用例翻译成以下内容:

我需要获取文件的第一行.我做

cat file | head -1 
Run Code Online (Sandbox Code Playgroud)

现在我想在文件列表上执行此操作.如何在一个unix命令中执行以下操作?例如:

find . -name "*.log" | ( xargs -iF cat F  | head -1 )
Run Code Online (Sandbox Code Playgroud)

显然上面命令中的括号不起作用.

有没有办法管道find命令的输出并在其上做两个命令(猫和头)?尝试使用; 和&&但帮助.我可以创建一个脚本 - 但是想在一个命令中执行此操作.

再次 - 这只是我的案例的翻译.

谢谢罗汉

Bol*_*olo 4

首先,head接受多个文件名,所以你可以简单地写:

 head -q -n 1 *.log
Run Code Online (Sandbox Code Playgroud)

或者:

find . -name '*.log' -exec head -n 1 '{}' ';'
Run Code Online (Sandbox Code Playgroud)

但是,如果您确实需要复制流,请使用tee并执行以下操作:

 wget -O - http://example.com/dvd.iso | tee >(sha1sum > dvd.sha1) > dvd.iso
Run Code Online (Sandbox Code Playgroud)

这个例子取自info coreutils 'tee invocation'.


更新(根据ade评论)在你的情况下tee将不起作用。您需要在另一个任务完成后执行一个任务,并且tee会或多或少同时触发这些任务(模缓冲)。

如果输入行中没有空格,另一种方法将起作用(我知道这是一个严重的问题,但我现在不确定如何克服它)。我将从一个通用的解决方案开始:

echo -e 'Foo\nBar\nBaz' | ( for i in `cat` ; do echo 1$i ; echo 2$i ; done )
Run Code Online (Sandbox Code Playgroud)

在这里,echo -e 'Foo\nBar\nBaz'创建一个示例多行输入,echo 1$i是要运行的第一个命令,echo 2$i是要运行的第二个命令。

我不熟悉ade,也没有在我的系统上安装它,但我猜在你的情况下,这样的东西可能会起作用:

ade describetrans | awk '/myapps/{ print $2 }' | sort -fr | ( for i in `cat` ; do ade unbranch $i ; ade checkin -all $i ; done )
Run Code Online (Sandbox Code Playgroud)

  • 这很好,但您可以将“;”替换为(非标准)“+”,以使“find”将多个名称传递给一个“head”子进程。 (2认同)