我想对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
兼容规范,我很好。我该怎么做?
答案 0 :(得分:2)
这不能从awk
本身完成。来自man gawk
版本4.1。0,2013年5月9日:
- 棉绒[=值]
提供有关对其他AWK实现可疑或不可移植的构造的警告。带有可选参数 致命的 lint警告成为致命错误。这可能是激烈的,但它的使用肯定会鼓励发展 更干净的AWK pro- 克。使用invalid的可选参数,仅发出关于实际上无效的事物的警告。 (这是 没有充分 已实施。)
您可以编写一个简单的包装器脚本来解析stderr
并仅显示您想要查看的警告。
答案 1 :(得分:0)
我正在用这个包装纸包装鹰嘴豆
#! /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时,其stdout进入复制的文件描述符(即stdout)。 gawk的stderr转到stdout并通过管道到达grep,然后grep输出发送回stderr。
如果gawk失败,由于pipefail
选项,脚本将退出并显示错误代码。如果grep无法产生输出(即,它会滤除所有警告),则脚本仍会成功。对于其他grep错误,脚本会失败。
将包装器另存为PATH中gawk
或awk
的位置,并确保该目录出现在PATH中/usr/bin
之前。
现在您有了一个聪明的awk,它只警告您关心的问题。