bash:如何连接两个命令的输出,以便我可以将它们连接到第三个?

Joh*_*den 25 bash shell mercurial awk concatenation

$ hg status
Run Code Online (Sandbox Code Playgroud)

$ hg status --ignored
Run Code Online (Sandbox Code Playgroud)

给出非常相似的输出.我想连接它们以便我可以将它们提供给awk,好像有一个hg状态--all(或svn的svn状态--no-ignore)

我想的是:

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

制作一个"确实非常干净"的命令,但它似乎偶尔会留下一个文件,可能是因为新行缺失或其他东西.

Vin*_*eib 29

使用花括号来分组命令:

$ { echo first line; echo second line; } | grep "line"
first line
second line
Run Code Online (Sandbox Code Playgroud)

(作为camh评论的回答)


Ala*_*avi 28

您可以使用子shell:

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

  • 没有必要使用子shell(另一个进程).相反,您可以使用大括号进行分组:`{a; b; } | C` (30认同)
  • @MarkFox:可能是测量误差.该组比子shell少了一个`fork()`.很难衡量一下这样的事情.您希望运行1000次或更多次以获得良好的性能感觉.当我这样做时,该组出现在1.69s,子弹出现在2.36s,这个速度慢了约40%. (3认同)

ric*_*chq 6

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

hg status -uriamn
Run Code Online (Sandbox Code Playgroud)

这显示了未知文件(u),删除文件(r),忽略(i),添加(a),修改(m),并且没有显示状态前缀.