有人能解释一下这个shell语句的含义吗



我对下面的shell语句感到困惑。

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

它是如何工作的?

感谢

此命令执行以下操作:-

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

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

因此,总的来说,执行后变量changeset将包含以changeset开头的hg parents命令第一行中的第二个字段。

Steve Weet的回答解释了发生了什么。不过,您的管道可以简化。在你的awk语句中,因为你的delimeter是:,所以你可以说awk -F: '$1 == "changeset" {print $2}'。此外,由于awk和sed有许多重叠的功能,您可以编写(如果您愿意,全部在一行):

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

最新更新