我对下面的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}'
)