真正退出 awk 脚本

Ste*_*nny 5 scripting awk exit

Perl 和 Rubyexit实际退出:

$ perl -e 'BEGIN {print 1; exit}; END {print 2}'
1

$ ruby -e 'BEGIN {print 1; exit}; END {print 2}'
1
Run Code Online (Sandbox Code Playgroud)

对 awk 来说不是这样:

$ awk 'BEGIN {print 1; exit}; END {print 2}'
1
2
Run Code Online (Sandbox Code Playgroud)

我试图用“help.awk”解决这个问题

$ perl -e 'BEGIN {print 1; exit}; END {print 2}'
1

$ ruby -e 'BEGIN {print 1; exit}; END {print 2}'
1
Run Code Online (Sandbox Code Playgroud)

但这会产生它自己的问题。如果“prog.awk”只有开始块:

$ awk 'BEGIN {print 1; exit}; END {print 2}'
1
2
Run Code Online (Sandbox Code Playgroud)

然后运行它:

awk -f help.awk -f prog.awk
Run Code Online (Sandbox Code Playgroud)

将导致它挂起等待输入。是否有更好的解决方案,用于真正退出 awk 脚本?

Ste*_*nny 2

如果 awk 程序有“中间”或END块,则读取输入。我们可以通过提供空输入来解决这个问题:

$ cat prog.awk
1
END {
  print "fin"
}

$ awk -f prog.awk /dev/null
fin
Run Code Online (Sandbox Code Playgroud)

如果我们希望这是默认值,我们可以向“help.awk”添加一个块:

BEGIN {
  if (ARGC == 1 && !system("[ -t 0 ]")) {
    ARGV[ARGC++] = "/dev/null"
  }
}
Run Code Online (Sandbox Code Playgroud)

然而,这带来了一个重要的变化;除非添加破折号,否则 awk 不会从终端读取数据:

awk -f help.awk -f prog.awk -
Run Code Online (Sandbox Code Playgroud)

或修改“prog.awk”:

awk -f help.awk -f prog.awk -
Run Code Online (Sandbox Code Playgroud)

读取输入示例:

getline < "-"
Run Code Online (Sandbox Code Playgroud)

不读取输入的示例:

$ cat prog.awk
/4/ {
  really_exit()
}
1
END {
  print "fin"
}

$ seq 10 | awk -f help.awk -f prog.awk
1
2
3
Run Code Online (Sandbox Code Playgroud)