尴尬的 awk 退出代码

尴尬的 awk 退出代码

我正在编写一些用于数据验证的 awk 脚本。这些旨在由另一个进程选择和调用,该进程需要查看 awk 脚本的退出代码以确定内容是否有效。但我在读取退出退出代码时遇到问题:

我编写这个脚本是为了尝试重现该程序并运行它......

#!/bin/awk -f

BEGIN { exit 1 }

$ ./test.sh ; echo $?
0

我原以为输出是 1。立即怀疑 awk 是错误的,而我是对的,我尝试了这个:

$ awk 'BEGIN { exit 1 }' ; echo $?
1

所以 awk 的退出确实 sem 做我想做的事,但当从 shebang 脚本运行时则不然。

然后我尝试:

#!/bin/env awk -f 

BEGIN { exit 1 }

$ ./test.sh ; echo $?
0
/bin/env: awk -f: No such file or directory

虽然我可以做到这一点......

#!/bin/sh

awk 'BEGIN { exit 1 }'

$ ./test.sh ; echo $?
1

然后,我在 vi 中释放了脚本的所有语法突出显示/操作(最多 200 行)。

同样,另一种选择是:

#!/bin/sh

awk -f $1
exit $?

但这需要管理 awk 脚本的路径以及包装可执行文件(${BASH_SOURCE[0]} 仅适用于 bash)。

理想情况下,我还想为 awk 设置“-W posix”选项,但这会增加更多的复杂性!

更新

在 OpenSuse 13 / awk 4.1.0 上运行上面的第一个脚本我得到了预期的结果(遗憾的是这并没有真正解决问题)

答案1

您没有提到您正在运行哪个操作系统或您正在使用哪个版本的 awk,但是在尝试使用 GNU awk (4.1.1) 在我的 Linux 主机上重现您的问题时,它对我来说效果很好。鉴于:

#!/bin/awk -f 

BEGIN { exit 1 }

当放入文件中时test.sh会导致:

$ ./test.sh
$ echo $?
1

我同意评论者的观点,他说这test.sh对于脚本来说是一个奇怪的名称awk。我会使用.awk扩展来明确它实际上不是 shell 脚本。

更新

在 RHEL 6.7 上:

$ rpm -q redhat-release-server
redhat-release-server-6Server-6.7.0.3.el6.x86_64

使用 awk:

$ awk --version
GNU Awk 3.1.7

一切看起来都很好。剧本:

$ cat test.awk
#!/bin/awk -f

BEGIN {exit 1}

结果:

$ ./test.awk
$ echo $?
1

相关内容