Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/unix/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Unix:运行2个从管道获取输入的命令?_Unix_Pipe - Fatal编程技术网

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

Unix:运行2个从管道获取输入的命令?,unix,pipe,Unix,Pipe,更新: 谢谢你的回答。正如我所说,我的q只是我用例的翻译。 让我详细谈谈我想要实现的目标。 在我的开发环境中,我们使用“ade”作为版本控制系统,我想做的是: ade describetrans | awk '/myapps/{ print $2 }' | sort -fr | xargs -iF ade unbranch F 现在,每次运行unbranch命令时,都会签出一个新文件/dir。所以我需要运行ade签入-毕竟我的unbranch命令。所以我需要像这样的东西 "pre part

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

ade describetrans | awk '/myapps/{ print $2 }' | sort -fr | xargs -iF ade unbranch F 
现在,每次运行unbranch命令时,都会签出一个新文件/dir。所以我需要运行ade签入-毕竟我的unbranch命令。所以我需要像这样的东西

"pre part till sort" | xargs -iF (ade unbranch + ade checkin -all) 
有没有办法在管道的op上运行2个命令

谢谢

原来的问题是:

我可以将我的用例转换为以下内容:

我需要得到文件的第一行。我知道

cat file | head -1 
现在我想在文件列表中执行此操作。如何在一个unix命令中执行以下操作?? 例如:

显然,上述命令中的括号不起作用

有没有办法通过管道将find命令的输出和do2命令(cat和head)连接起来?试用;和&&但是没有帮助。 我可以创建一个脚本,但我想用一个命令来完成

再说一次,这只是我的案例的翻译

谢谢
Rohan

首先,
head
接受多个文件名,因此您可以简单地编写:

 head -q -n 1 *.log
或:

但是,如果确实需要复制流,则使用
tee
并按照以下步骤执行操作:

 wget -O - http://example.com/dvd.iso | tee >(sha1sum > dvd.sha1) > dvd.iso
此示例取自
info coreutils'tee invocation'


更新(在
ade
注释之后)在您的情况下
tee
将不起作用。您需要在另一个任务完成后执行一个任务,
tee
将或多或少同时触发这些任务(模缓冲)

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

echo -e 'Foo\nBar\nBaz' | ( for i in `cat` ; do echo 1$i ; echo 2$i ; done )
这里,
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 )

通过将输入管道化到
头中,而不是简单地给它一个文件名,您使这比需要的复杂得多:

如果不需要遍历子目录,可以使其更简单:

head -n1 *.log

您可以通过管道通过grep:
|grep-v'^(=>.*无用地使用
cat
)来筛选文件名标题。只需将文件名传递给
标题

find . -name '*.log' -exec head -n 1 '{}' '+'

编辑:这将打印每个文件的标题。在Linux上,可以使用
-q
抑制此操作,但在其他系统上,必须确保使用单个参数调用
head

find . -name '*.log' -exec head -n 1 '{}' ';'
试一试

这是假设
ade
一次接受多个文件,并且需要为每个文件调用
ade签入-all


字符串
arg0
-c
字符串中提供
$0
的值。

我不知道
ade
,因此我必须猜测这两个命令需要什么 要运行真的是。但是如果你有GNU并行 应安装其中一个 工作:

如果
ade
可以并行运行,则可以删除
-j1

观看GNU Parallel的介绍视频,了解更多信息:

这不是更适合serverfault.com吗?或者这被认为是shell编程吗?:-)这是一个边缘案例。在交互模式下键入的复杂shell命令不是编程,它属于superuser.com,但编写包含同一行的shell脚本是编程。应该在Meta上讨论。如果文件名包含空格或换行符,第一个将不起作用。第二个将额外打印带有文件名的标题,除非您添加
-q
-q
是非标准的,在BSD系统上不存在。这很好,但您可以替换
使用(非标准)
+
进行
查找
将多个名称传递给一个
子流程。@Philipp哦,我不知道
+
,这很酷!我没有(再次)修改我的答案,而是对你的信息性评论投了更高的票。谢谢你的回答。正如我所说,我的q只是我用例的翻译。让我详细谈谈我想要实现的目标。在我的开发环境中,我们使用“ade”作为版本控制系统,我想做的是:ade descripbetrans | awk'/myapps/{print$2}'| sort-fr | xargs-如果现在使用ade unbanch F,那么每次运行unbanch命令时,都会签出一个新文件/dir。所以我需要运行ade签入-毕竟我的unbranch命令。所以我需要像| xargs-iF(ade unbranch+ade checkin-all)这样的东西来在管道的op上运行2个命令?
head -n1 *.log
find . -name '*.log' -exec head -n 1 '{}' '+'
find . -name '*.log' -print0 | xargs -0 head -n 1
find . -name '*.log' -exec head -n 1 '{}' ';'
ade describetrans | awk '/myapps/{ print $2 }' | sort -fr | xargs sh -c 'ade unbranch "$@"; ade checkin -all "$@"' arg0
ade describetrans | awk '/myapps/{ print $2 }' | sort -fr |
parallel -j1 ade unbranch {} ";" ade checkin -all {}

ade describetrans | awk '/myapps/{ print $2 }' | sort -fr |
parallel -j1 ade unbranch {} ";" ade checkin -all

ade describetrans | awk '/myapps/{ print $2 }' | sort -fr |
parallel -j1 ade unbranch {} ; ade checkin -all