【问题标题】:invoking perl scripts调用 perl 脚本
【发布时间】:2010-08-30 07:25:44
【问题描述】:

我有以 #!/usr/bin/perl#!/usr/bin/env perl 开头的 perl 脚本

首先,第二个版本是什么意思?

其次,我使用 Ubuntu。所有脚本都设置为可执行文件。当我尝试通过简单地调用脚本的名称(例如./script.pl)来运行脚本时,我得到: No such file or directory。当我通过perl ./script.pl 调用时,它运行良好。

为什么?

【问题讨论】:

  • 有点长镜头 - 它们是你从某个地方下载的脚本,你可能在文件中得到 CR LF 行结尾而不是 LF 。
  • which perl/usr/bin/perl。这些是我写的(现在还在写)的脚本。我只在 ubuntu 上工作。
  • 看起来不错。尝试在strace 下运行脚本 - 看看究竟是什么触发了错误。

标签: perl


【解决方案1】:

#!/usr/bin/env perl 使用标准 POSIX 工具 env 来解决 UNIX 不支持 shebang 行 (AFAIK) 中的相对路径的“问题”。 env 工具可用于在修改环境变量后启动程序(在本例中为 perl)。在这种情况下,不会修改任何变量,env 然后在 PATH 中搜索 Perl 并运行它。因此,即使 Perl 没有安装在 /usr/bin 中,而是安装在其他路径(必须在 PATH 变量中),带有特定 shebang 行的脚本也可以工作。

然后,您对 ./script.pl 不起作用的问题:您说它设置了可执行位,就像 chmod +x script.pl 一样?但它是否也以 shebang (#!) 行开头?也就是说,前两个字节必须是#!,并且后面必须跟一个文件路径(到 perl)。有必要告诉内核使用哪个程序来运行这个脚本。如果你这样做了,路径是否正确?你想试试#!/usr/bin/env perl 变体;-)

【讨论】:

  • 脚本的第一行是#!/usr/bin/env perl。我还尝试用#!/usr/bin/perl(我的系统上确实存在)替换它,但这也无法提供相同的错误消息。
  • @David B:which envwhich perl 说什么?
  • @Dummy00001: $ which env => /usr/bin/env, $ which perl => /usr/bin/perl
  • 当我尝试使用 /usr/bin/env 传递 -W 标志时出现错误,而 /usr/bin/perl -W 就像一个魅力。有什么解决方法吗?
  • @Aif:你到底输入了什么? #!/usr/bin/env perl -W 应该可以工作。
【解决方案2】:

使用#!/usr/bin/env perl 可以解决perl 不一定在每个系统上都在/usr/bin 中的问题;它只是为了使脚本更便携


在相关说明中,对于您的第二个问题,是否有 /usr/bin/perl 和/或 /usr/bin/env?如果不是,那就解释了为什么直接运行脚本不起作用;如果您将脚本作为 perl 的参数运行,则不会处理 shebang

【讨论】:

  • 澄清一下 - 如果您运行 perl script,它会忽略 shebang 行中的任何路径,但它会查看该行中的任何选项标志。
  • 只是为了澄清边缘情况:如果您运行“perl 脚本”,当(且仅当)shebang 行包含单词“perl”时,它会忽略 shebang 行中的任何路径。如果你把 "#!/bin/sh" 放在那里,perl 会很聪明地为你执行 sh。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-07-23
  • 2015-09-19
  • 2014-06-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多