使用参数(vars)调用具有awk shebang的脚本

Oll*_*ers 26 shell awk shebang

我有一个我已定义的awk脚本:

#!/usr/bin/env awk
BEGIN { if (!len) len = 1; end = start + len }
{ for (i = start; i < end; i++) { print $1 } }
Run Code Online (Sandbox Code Playgroud)

我已经保存为columnschmod +x倒是它.我想调用它,这样startend它横越在一个文件中定义.我以为这应该工作:

cat some_file | columns -v start=2
Run Code Online (Sandbox Code Playgroud)

但事实并非如此.救命!

ags*_*mek 51

尝试使用:

#!/usr/bin/awk -f
Run Code Online (Sandbox Code Playgroud)

作为翻译

  • @mklement0 它不在我的(NixOS)上。由于 NixOS 将所有包保持隔离并位于非标准路径上。我认为在我的情况下使用 mss 的答案会更好。**编辑** 这也不起作用,因为`-S` 不符合 POSIX 标准 :( (2认同)

小智 6

env是解决此问题的最简单方法:

#!/usr/bin/env -S awk -f
Run Code Online (Sandbox Code Playgroud)

添加更多选项,并确保不干扰您的参数和awk的参数:

#!/usr/bin/env -S awk -F: -f ${_} --
BEGIN {
    # delete argv[1], which == ENVIRON[_]
    delete ARGV[1]
} # rest of my awk program
Run Code Online (Sandbox Code Playgroud)

由于env有一个POSIX标准,这个shbang可以让你解决unixen上非标准shbang实现的困难.

编辑

写完之后我意识到'-S'是一个非POSIX兼容的FreeBSD env扩展.所以shell包装器可能是要走的路,不幸的是,就是这样.

  • 谢谢你指出`-S`是非标准的. (11认同)
  • 我们希望在版本8.29之后将其添加到GNU coreutils (3认同)