在这种情况下,为什么我可以将参数传递给 /usr/bin/env?

mbi*_*ras 6 arguments shebang

我在另一个答案中读到,我无法将参数传递给解释器,而不是我给出的/usr/bin/env

另一个潜在的问题是该#!/usr/bin/env技巧不允许您将参数传递给解释器(除了脚本的名称,它是隐式传递的)。

但是,看起来我能够做到,因为awk当我不给它-f标志时它会损坏,而当我给它标志时它会被修复-f,同时使用/usr/bin/env

首先,没有-f标志:

$ cat wrap_in_quotes
#!/usr/bin/env awk
# wrap each line in quotes
# usage: wrap_in_quotes [ file ... ]
{ print "\""$0"\"" }
$ echo foobar | ./wrap_in_quotes
awk: syntax error at source line 1
 context is
     >>> . <<< /wrap_in_quotes
awk: bailing out at source line 1
Run Code Online (Sandbox Code Playgroud)

二、带-f旗:

$ vim wrap_in_quotes
$ cat wrap_in_quotes
#!/usr/bin/env awk -f
# wrap each line in quotes
# usage: wrap_in_quotes [ file ... ]
{ print "\""$0"\"" }
$ echo foobar | ./wrap_in_quotes
"foobar"
Run Code Online (Sandbox Code Playgroud)
  • 因此,如果根据链接的答案我无法将标志传递给解释器,为什么我能够将-f标志传递给awk

我正在运行macOS

$ sw_vers
ProductName:    Mac OS X
ProductVersion: 10.12.1
BuildVersion:   16B2657
Run Code Online (Sandbox Code Playgroud)

Kus*_*nda 9

一些 Unices,尤其是 macOS(直到 2005 年,FreeBSD)将允许这样做,而 Linux 则不允许。

相反的问题:带有 `#!/usr/bin/env command --argument` 的 Shebang 行在 Linux 上失败

  • TLDR:`#!/usr/bin/env -S awk -f` (2认同)