awk – 如何在getline管道中获取命令的退出状态?
发布时间:2020-12-14 02:19:21 所属栏目:Linux 来源:网络整理
导读:在POSIX awk中,如何通过命令|处理其输出后从命令获取退出状态(返回代码) getline var?如果命令以非零退出状态退出,我希望我的awk脚本退出1. 例如,假设我有一个名为foo.awk的awk脚本,如下所示: function close_and_get_exit_status(cmd) { # magic goes her
在POSIX awk中,如何通过命令|处理其输出后从命令获取退出状态(返回代码) getline var?如果命令以非零退出状态退出,我希望我的awk脚本退出1.
例如,假设我有一个名为foo.awk的awk脚本,如下所示: function close_and_get_exit_status(cmd) { # magic goes here... } BEGIN { cmd = "echo foo; echo bar; echo baz; false" while ((cmd | getline line) > 0) print "got a line of text: " line if (close_and_get_exit_status(cmd) != 0) { print "ERROR: command '" cmd "' failed" | "cat >&2" exit 1 } print "command '" cmd "' was successful" } 然后我希望发生以下情况: $awk -f foo.awk got a line of text: foo got a line of text: bar got a line of text: baz ERROR: command 'echo foo; echo bar; echo baz; false' failed $echo $? 1 根据POSIX specification for awk,命令| getline为成功输入返回1,为文件结束返回0,为错误返回-1.如果命令以非零退出状态退出,则不是错误,因此不能用于查看命令是否已完成且失败. 类似地,close()不能用于此目的:close()仅在关闭失败时返回非零,而不是在关联命令返回非零退出状态时返回非零. (在gawk中,close(命令)返回命令的退出状态.这是我想要的行为,但我认为它违反了POSIX规范,并不是所有的awk实现都是这样的.) awk system()函数返回命令的退出状态,但据我所知,没有办法使用getline. 解决方法
最简单的方法是在命令执行后从shell回显退出状态,然后使用getline读取它.例如
$cat tst.awk BEGIN { cmd = "echo foo; echo bar; echo baz; false" mod = cmd "; echo "$?"" while ((mod | getline line) > 0) { if (numLines++) print "got a line of text: " prev prev = line } status = line close(mod) if (status != 0) { print "ERROR: command '" cmd "' failed" | "cat >&2" exit 1 } print "command '" cmd "' was successful" } $awk -f tst.awk got a line of text: foo got a line of text: bar got a line of text: baz ERROR: command 'echo foo; echo bar; echo baz; false' failed $echo $? 1 如果有人正在阅读此内容并考虑使用getline,请务必阅读http://awk.freeshell.org/AllAboutGetline并完全理解所有注意事项以及首先要做的事情. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |