我对以下shell声明感到困惑。
export changeset=`hg parents | awk -F: '/^changeset:/ { print $2 }' | sed -e 's/ //g' -e 1q`
它是如何运作的?
谢谢
答案 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}'
)