如何获得 awk 的 system() 命令的指定行为?

如何获得 awk 的 system() 命令的指定行为?

我像这样从 awk 调用 sleep 命令:system("sleep 15m")并发现当我用 CTRL-C 中断它时,它只会中断 sleep 命令,而不是脚本。所以我尝试按照建议将系统函数包装在 if 语句中在此示例脚本中并进一步解释这里。然后它看起来像if (system("sleep 15m") != 0) exit 1

这不起作用,所以我尝试了print system("sleep 3"),它总是返回 0,这与规定的行为相反。如果我让它运行,那么在 shell 中输入sleep 3then会产生 0,如果我中断它,会产生 130。echo $?

那么我错过了什么?我多次检查了拼写错误,尝试了 --posix 和 --traditional 开关,并研究了用户指南,但没有任何改变。

$ awk --version
GNU Awk 4.1.3, API: 1.1 (GNU MPFR 3.1.4, GNU MP 6.1.0)
Copyright (C) 1989, 1991-2015 Free Software Foundation.

答案1

似乎是一个傻瓜错误

$ echo foo | gawk '{print system("sleep 3")}'
^C0
$ 

似乎与当 AWK 调用并用 ^C 中断时,使 bash 退出 != 0

gawk 解决方法,由 Keith 提供

$ echo foo | awk '{if(system("sleep 3 && exit 42")==42){print "completed"}else{print "interrupted"}}'
completed
$ echo foo | awk '{if(system("sleep 3 && exit 42")==42){print "completed"}else{print "interrupted"}}'
^Cinterrupted
$

nawk 正确处理它

$ echo foo | nawk '{print system("sleep 3")}'
^C0.0078125
$

相关内容