getline()
我正在尝试使用GNU 的函数运行一些命令awk
并打印errno
返回的错误号 ( ) 值。但是对于不存在目录/文件的简单故障情况,该变量似乎没有被填充。
awk 'BEGIN {
cmd = "ls -lrth /non/existing/path"
while ( ( cmd | getline result ) > 0 ) {
print result
}
close(cmd); print ENVIRON["ERRNO"]
}'
当上述从 中取出错误字符串时ls
,该print
语句不会产生有效的错误号。我也尝试从手册页中使用PROCINFO["errno"]
,PROCINFO["ERRNO"]
但没有奏效。我还尝试在关闭文件描述符之前打印它也不起作用。ENOENT
在这种情况下期望是错误的吗?
您无法使用
getline
. 在您的命令中,输出来自ls
,而不是print result
。在 form
cmd | getline result
中cmd
运行,然后将其输出通过管道传输到getline
.1
如果有输出,0
如果 EOF,-1
失败时返回。问题是失败来自运行getline
本身,而不是cmd
. 例子:您会看到
/etc/shadow
无法读取,因此getline
无法运行并在ERRNO
变量中报告错误。请注意,
cmd
如果不是 posix 模式,GNU awk 将返回状态,因此您可以执行以下操作:在 POSIX 模式下,您不会获得退出状态:
如果 getline 或 close 失败, ERRNO 将仅由 gawk 设置(仅限GNU awk ),但它成功读取 ls 的(空!)输出。该输出是空的,因为 ls 在标准错误通道上给出了错误消息(“ls: cannot access ...”),没有向标准输出写入任何内容,并且存在错误代码。
使用 GNU awk,您可以像这样获得命令的退出状态:
如果您需要命令的错误消息,则必须将其标准错误通道重定向到某个文件,并阅读: