Function awk-测试打印是否成功

Function awk-测试打印是否成功,function,awk,printing,status,Function,Awk,Printing,Status,awk中的print语句可能失败的原因有几个:没有写入指定文件的权限,文件不存在,awk无法创建它,等等。如何测试awkprint语句的成功?我尝试了以下方法: $ cat printError.awk BEGIN { if (! (print("Hello") > "/this/doesnt/exist")) { print "Could not print" } } 但它给出了一个语法错误,我认为这是因为print是一个语句而不是一个函数 $ awk

awk
中的
print
语句可能失败的原因有几个:没有写入指定文件的权限,文件不存在,awk无法创建它,等等。如何测试
awk
print语句的成功?我尝试了以下方法:

$ cat printError.awk
BEGIN {
    if (! (print("Hello") > "/this/doesnt/exist")) {
        print "Could not print"
    }
}
但它给出了一个语法错误,我认为这是因为print是一个语句而不是一个函数

$ awk -f printError.awk 
awk: printError.awk:2:  if (! (print("Hello") > "/this/doesnt/exist")) {
awk: printError.awk:2:         ^ syntax error
awk: printError.awk:2:  if (! (print("Hello") > "/this/doesnt/exist")) {
awk: printError.awk:2:                                               ^ syntax error
awk: printError.awk:2:  if (! (print("Hello") > "/this/doesnt/exist")) {
awk: printError.awk:2:                                                 ^ syntax error
编辑:
我找到了gawk 4.2+的解决方案,但我工作的环境只有4.0,因此我仍在寻找该版本的解决方案。

对于gawk 4.2,答案如下:。但似乎PROCINFO[“非致命的”]在早期版本中并不存在

5.10启用非致命输出

本节介绍了一个特定于gawk的功能

在标准awk中,使用print或printf输出到不存在的文件,或 其他一些I/O错误(如填充磁盘)是致命错误

$gawk'BEGIN{print“hi”>“/no/so/file”}错误→ 呆呆的:cmd。 第1行:致命:无法重定向到“/no/so/file”(无错误)→ 这样的文件 (或目录)

gawk可以检测到发生了错误,允许 您可能需要从错误中恢复,或者至少打印一个错误 退出前,您选择的消息。你可以用两种方法中的一种来做 方式:

输出是非致命的

启用非致命输出后,必须在 每一个相关的print或printf语句,以查看是否出现了问题 错。在之前将ERRNO初始化为零也是一个好主意 正在尝试输出

使用以下awk程序:

$ cat nonFatal.awk 
BEGIN {
    PROCINFO["NONFATAL"] = 1
    ERRNO = 0
    print "hi" > "/no/such/file"
    if (ERRNO) {
        print("Output failed:", ERRNO) > "/dev/stderr"
        exit 1
    }
}
该错误在gawk 4.0和4.1中仍然是致命的

$ gawk -f nonFatal.awk 
gawk: nonFatal.awk:4: fatal: can't redirect to `/no/such/file' (No such file or directory)
但在gawk 4.2.1中它是有效的(我将gawk 4.2.1编译为gawk-4.2.1):


很好,仔细研究过的答案!
$ gawk -f nonFatal.awk 
gawk: nonFatal.awk:4: fatal: can't redirect to `/no/such/file' (No such file or directory)
$ ./gawk-4.2.1 -f /var/tmp/nonFatal.awk 
Output failed: No such file or directory