gpt4 book ai didi

awk - 如何获取 getline 管道中命令的退出状态?

转载 作者:行者123 更新时间:2023-12-02 03:25:24 25 4
gpt4 key购买 nike

在 POSIX awk 中,如何在通过 command 处理其输出后从 command 获取退出状态(返回代码)|获取行变量?如果 command 以非零退出状态退出,我希望我的 awk 脚本 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 specification for awk , 命令 | getline 返回 1 表示成功输入,0 表示文件结尾,-1 表示错误。如果 command 以非零退出状态退出,则不是错误,因此不能使用它来查看 command 是否已完成以及是否失败。

同样,close() 也不能用于此目的:close() 仅在关闭失败时返回非零,而在关联命令返回时则不会返回非零非零退出状态。 (在 gawk 中,close(command) 返回 command 的退出状态。这是我想要的行为,但我认为它违反了 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并首先充分理解这样做的所有注意事项和影响。

关于awk - 如何获取 getline 管道中命令的退出状态?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21296859/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com