Perl 和 Rubyexit
实际上已经退出:
$ perl -e 'BEGIN {print 1; exit}; END {print 2}'
1
$ ruby -e 'BEGIN {print 1; exit}; END {print 2}'
1
但对于 Awk 来说则不然:
$ awk 'BEGIN {print 1; exit}; END {print 2}'
1
2
我尝试用“help.awk”解决这个问题
function really_exit() {
IM_SURE = 1
exit
}
END {
if (IM_SURE) {
exit
}
}
但这也产生了自己的问题。如果“prog.awk”只有开始块:
BEGIN {
print "start"
}
然后运行它:
awk -f help.awk -f prog.awk
将导致它挂起等待输入。是否有更好的解决方案可以真正退出 Awk 脚本?
答案1
如果 awk 程序有“中间”或END
块,则读取输入。我们可以通过提供空输入来解决这个问题:
$ cat prog.awk
1
END {
print "fin"
}
$ awk -f prog.awk /dev/null
fin
如果我们希望这是默认值,我们可以向“help.awk”添加一个块:
BEGIN {
if (ARGC == 1 && !system("[ -t 0 ]")) {
ARGV[ARGC++] = "/dev/null"
}
}
然而,这带来了一个重要的变化;除非添加破折号,否则 awk 不会从终端读取数据:
awk -f help.awk -f prog.awk -
或修改“prog.awk”:
getline < "-"
读取输入示例:
$ cat prog.awk
/4/ {
really_exit()
}
1
END {
print "fin"
}
$ seq 10 | awk -f help.awk -f prog.awk
1
2
3
不读取输入的示例:
$ cat prog.awk
BEGIN {
print "start"
really_exit()
}
END {
print "fin"
}
$ awk -f help.awk -f prog.awk
start