未知路径的Shell脚本shebang

24

如果不知道要执行的程序的路径,是否有可能指定一个shebang行?

可能不需要指定路径。

#!node

或指定多个选项

#!/usr/local/bin/node
#!/usr/bin/node

如果能提供跨平台解决方案(支持多种Linux、BSD、OSX等操作系统),将会得到额外的加分。

4个回答

27

/usr/bin/env是专门用于跨平台解决方案的。

env executes utility after modifying the environment as specified on
the command line.  The option name=value specifies an environmental
variable, name, with a value of value.  The option `-i' causes env
to completely ignore the environment it inherits.

If no utility is specified, env prints out the names and values of
the variables in the environment, with one name=value pair per line.

做类似以下的事情:

#!/usr/bin/env node

将会跨平台且是“正确的选择”。


确实,这是最跨平台的。遗憾的是,POSIX没有指定env在哪里,但我还没有找到一个系统它不在/usr/bin中的情况。有人见过一个奇怪的操作系统没有吗? - Jens
在 shebang 行中连续传递多个程序是否可行?(!#/usr/bin/env cat | nl) - Billy Moon
不,不可能。如果必须的话,请使用单独的脚本。 - Jens
2
我刚刚发现在OpenServer 5.0.6和Unicos 9.0.2中只有/bin/env存在... - Jens
1
增加到“其他envs”体验:我使用的超级计算机是/bin/env,这使得为我的本地计算机和超级计算机开发变得非常烦人。 - Carl
显示剩余4条评论

0

与人们可能认为的相反,env没有标准位置,因此我们只能获取有关其位置的一些信息:

  • /usr/bin/env - MacOS(10.12)
  • 两者都是/bin/env/usr/bin/env - Fedora(25)

我相信其他人也能扩展这个列表。


-3
在 shebang 后面加一个空格。如果程序在环境变量 PATH 中,它应该可以运行。
#! perl

当然,对于Perl来说,这是一个特殊情况。
:
eval 'exec perl -S $0 ${1+"$@"}'
  if 0;

这适用于Unix OSX,即使像@Jens所指出的那样,没有 /usr/bin/env。


1
在Debian上无法运行:-bash: ./foo: bash: bad interpreter: No such file or directory - dualed

-4
不要使用 shebang。
node <<eof
your node program here
eof

1
我不是那个给你点踩的人,但这并没有解决你的问题,也没有回答你的问题。 - Jens
1
它适用于所有符合POSIX标准的系统,您可以向命令添加选项并重定向输出。在Linux上,这个<code>#!/usr/bin/env sh -x</code>不起作用。 - hipe
3
一些背景信息,shebang指示操作系统终止它生成的新shell并使用shebang后的程序重新运行整个脚本。如果没有shebang,则使用该shell处理输出,在某些特定情况下,这可能会导致意外或不良的结果,具体取决于shell。更不用说多余的进程(虽然这在实践中不是您需要担心的事情)。即使我的第一反应是downvote,但downvote并不真正值得,我甚至被教导即使对于shell脚本也要使用shebang。 - Pyrocater

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接