在POSIX awk中,如果我通过
例如,假设我有一个名为
command | getline var
处理输出后,要如何获取command
的退出状态码(返回码)呢?我希望我的awk脚本在command
以非零的退出状态码退出时也能执行exit 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规范的awk部分,command | getline
返回1表示成功输入,0表示文件末尾,-1表示错误。如果command
以非零的退出状态退出,则不算作错误,因此无法用于检查command
是否完成且失败。
类似地,close()
不能用于此目的:close()
仅在关闭失败时返回非零值,而不会在相关命令返回非零退出状态时返回非零值。(在gawk中,close(command)
返回command
的退出状态。这就是我想要的行为,但我认为它违反了POSIX规范,并且并非awk的所有实现都表现出这种行为。)
awk的system()
函数返回命令的退出状态,但据我所知,无法与getline
一起使用。
ERRNO
来帮助您获取退出状态。如果getline
找到一条记录,则返回 1;如果遇到文件结束,则返回 0。如果在获取记录时出现某些错误(例如无法打开文件),则getline
返回 -1。在这种情况下,gawk将变量ERRNO
设置为描述所发生错误的字符串。 - BMWERRNO
。而且,即使在gawk中,返回非零的命令也不会导致getline
返回-1。 - Richard Hansengawk 'BEGIN{ cmd="exit 1"; cmd | getline; print close(cmd)}'
我得到256,但在版本5.0.1(64位)中得到1。 - jarno