2

我想对标准使用一些gawk扩展awk,例如mktime(). 同时,我想使用该选项--lint=fatal,因为我宁愿让进程失败,也不愿让它默默地产生可能不正确的数据。但是,有一点我不明白:

$ gawk --lint=fatal 'BEGIN { foo = mktime("2013 01 01 12 00 00"); }' 
gawk: cmd. line:1: fatal: `mktime' is a gawk extension

我没有指定选项--posix--traditional,因此gawk应该存在扩展名。一旦我降低了严格性(--lint=warning),脚本就可以工作了。为了使用严格的检查,我必须告诉我gawk知道我正在使用您的扩展功能集并且我不再与原始awk规范兼容,我对此很好。我怎样才能做到这一点?

4

2 回答 2

2

这不能靠awk自己来完成。从man gawk2013 年 5 月 9 日版本 4.1.0 开始:

--lint[=值]

提供有关可疑或不可移植到其他 AWK 实现的构造的警告。使用致命的可选参数,lint 警告成为致命错误。这可能很激烈,但它的使用肯定会鼓励更清洁的 AWK 程序的开发。使用无效的可选参数,仅发出有关实际无效事物的警告。(这还没有完全实现。)

您可以编写一个简单的包装脚本来解析stderr并仅显示您想要查看的警告。

于 2013-05-25T13:50:12.530 回答
0

我正在使用这个包装器进行 gawk

#! /bin/bash
AWK="/usr/bin/gawk --lint"
exec 3>&1
set -o pipefail
$AWK "$@" 2>&1 1>&3 | { grep -v 'is a gawk extension$' || test $? = 1; }

文件描述符 3 成为标准输出的副本。当 gawk 运行时,它的标准输出转到复制的文件描述符(即标准输出)。gawk 的 stderr 到 stdout 并通过管道到 grep,然后将 grep 输出发送回 stderr。

如果 gawk 失败,由于该pipefail选项,脚本会以错误代码退出。如果 grep 无法产生输出(即过滤掉所有警告),脚本仍然会成功。对于其他 grep 错误,脚本会失败。

将包装器保存为PATH 中的某个位置gawkawk某个位置,并确保该目录出现在 PATH 之前/usr/bin

现在你有了一个智能 awk,它只对你关心的问题发出警告。

于 2018-07-24T03:48:17.863 回答