相当于通过输入文件的路径来执行文件(使用 shebang 行)?

Bre*_*els 7 executable shell-script shebang

假设我有一个文件hello

#!/bin/sh

echo "Hello World!"
Run Code Online (Sandbox Code Playgroud)

如果在该文件上设置了可执行位,我可以通过在提示中输入其路径来执行它:

$ ./hello
Hello World!
Run Code Online (Sandbox Code Playgroud)

是否有更明确的等价于上述内容?类似于:

$ execute hello
Run Code Online (Sandbox Code Playgroud)

我知道我可以将hello作为参数传递给/bin/sh,但我正在寻找一种解决方案,该解决方案可以自动使用 shebang 行中指定的解释器

我的用例是执行没有设置可执行标志的脚本文件。这些文件存储在 git 存储库中,因此我想避免设置它们的可执行标志或必须先将它们复制到另一个位置。

pLu*_*umo 18

您可以使用perl

perl hello
Run Code Online (Sandbox Code Playgroud)

perl文档

如果#! 行不包含单词“perl”和单词“indir”,程序以#! 代替 Perl 解释器执行。这有点奇怪,但它可以帮助那些不执行 #! 的机器上的人,因为他们可以告诉程序他们的 SHELL 是 /usr/bin/perl,然后 Perl 会将程序分派给正确的解释器。

(通过)

  • 我想我再也找不到 Perl 的用处了! (7认同)
  • 但是,请注意,这与通过内核进行的操作并不完全相同:首先,Perl 可能会以与系统不同的方式处理 hashbang 行的多个参数。据我所知,`perl` 只使用第一个,而 Linux 将所有内容都放在一个参数中,而其他一些系统可能支持多个。例如,`#!/bin/bash -x -u` 在 Perl 下以 `-x` 开始,而在 macOS 下,Bash 获得两个选项,而在 Linux 上,它获得单个参数 `-x -u`(即产生错误)。此外,如果系统支持 setuid 脚本,则不可能用 `perl` 来模拟它。 (6认同)
  • 对我来说,这不是更明确的等价于 `./hello`,而是混淆的根源。 (3认同)
  • @Aaron 我同意这很令人困惑,但除了滚动我自己的(我想避免的)之外,似乎没有其他选择。 (2认同)