bash:如何将两个命令的输出串联起来以便将它们传输到第三个命令?

26
$ hg status
并且
$ hg status --ignored

这两个命令的输出非常相似。我想将它们拼接起来,以便可以像使用hg status --all(或svn的 svn status --no-ignore)一样将它们传递给awk。

我考虑使用以下命令:

$ echo "$(hg status)" "$(hg status --ignored)" | awk  ' ( $1 == "?" ) || ( $1 == "I") { print $2 }' | xargs rm -r

我想创建一个"非常干净的make命令",但是它似乎偶尔会留下一个文件,可能是因为换行符丢失了或者其他原因。


如果您将rm替换为echo(或跳过最后一个管道),那么输出是什么,应该是什么?此外,可能会存在权限问题,其中rm拒绝删除文件。 - Fred Foo
4个回答

30

太好了,谢谢。这正是我在寻找的,我试图将标题连接起来,以便与另一个命令的输出一起传递给sendmail -t - Aaron Wallentine

29

您可以使用子shell:

( hg status; hg status --ignored ) | awk '( $1 == "?" ) || ( $1 == "I") { print $2 }' | xargs rm -r

30
不需要使用子shell(另一个进程),可以使用花括号进行分组:{ a; b; } | c - camh
1
我并没有看到任何有意义的速度差异,time { git branch; git branch -r; } > /dev/null; time (git branch; git branch -r) > /dev/null 实际上,在我的系统上,子shell 总是更快。那么@camh,组的优势是什么呢? - Mark Fox
3
很可能是测量误差。这个组比子shell少一个 fork()。像这样的单次运行很难进行准确测量。你需要运行1000次或更多次才能获得性能的良好感受。当我这样做时,组用时1.69秒,子shell用时2.36秒,慢大约40%。 - camh

6

您可以使用其它 hg 状态标志来显示您真正想要的内容:

hg status -uriamn

那显示未知文件(u),已删除文件(r),被忽略的文件(i),已添加文件(a),已修改文件(m),而且不显示状态前缀。

+1 我刚写下了“为什么不尝试hg st -iu|awk ...?”然后看到你的答案出现了... - Kent
我本想早些发布,但我一直在尝试将旗帜制作成有趣的变位词;-) - richq

4
这对我有用:

这个对我很有效:

echo $(a)$(b)

如果你添加 "" ,你可以添加分隔符,例如:

echo "$(./gethostname.sh)|($(./getip.sh);"

我在 Openwrt 上使用这个来广播我的 IP 设置:

echo "$( uci get system.@system[0].hostname )|$( ip addr | grep inet | grep br-lan | cut -d ' ' -f 6 | cut -d '/' -f 1 );"  | socat - UDP-DATAGRAM:255.255.255.255:4999,broadcast ;

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接