任何人都可以解释这个shell语句的含义吗?

时间:2011-05-27 10:53:00

标签: shell sed awk

我对以下shell声明感到困惑。

 export changeset=`hg parents | awk -F: '/^changeset:/ { print $2 }' | sed -e 's/ //g' -e 1q` 

它是如何运作的?

谢谢

2 个答案:

答案 0 :(得分:4)

此命令执行以下操作: -

  • hg parents运行mercurial命令parent
  • awk -F: '/^changeset:/ { print $2 }'启动awk读取其输入,对于以changeset开头的任何行,它会在行上打印第二个字段(字段用以下分隔:)
  • sed -e 's/ //g' -e 1q`读取所有输入,删除空格并打印第一行
  • export changeset=将反引号之间的所有内容作为一系列命令运行,并将结果分配给变量changeset。

管道符号将命令连接在一起,导致一个程序的标准输出(STDOUT)成为另一个程序的标准输入(STDIN)。

总而言之,在执行之后,变量changeset将包含以变更集开头的hg parents命令的第一行中的第二个字段。

答案 1 :(得分:1)

Steve Weet's answer解释了发生了什么。您的管道可以简化。在您的awk语句中,因为您的分隔符为:,您可以说awk -F: '$1 == "changeset" {print $2}'。另外,因为awk和sed有很多重叠的函数,你可以写(如果你愿意,可以在一行上编写):

export changeset=$(
  hg parents | 
  awk -F: '$1 == "changeset" {gsub(/ /, "", $2); print $2; exit}'
)