【问题标题】:More precedence- Shebang line or perl command?更多优先级 - Shebang line 或 perl 命令?
【发布时间】:2014-12-16 11:43:01
【问题描述】:

我有多个 Perl 脚本,其中 shebang 行已过时。也就是说,shebang 指向的是旧版本的 Perl。

每条路径旧:

#!/data/oracle10.0/perl/bin/perl

新版Perl在

#!/data/**oracle11.0**/perl/bin/perl

我已将 perl 命令软链接到新版本 perl 的位置。

perl -> /data/oracle11.0/perl/bin/perl

现在,shebang 指向旧版本,perl 命令指向新版本。

所以,当我执行perl sample.pl 时,shebang 会被忽略。

我写了一些示例脚本来看看。当我使用 perl 命令时,似乎忽略了 shebang 行。但我记得旧版本的 perl 不是这种情况(Shebang 被认为超过了perl 命令)。

所以我的问题是,新版本的 perl(5.10) 和旧版本 (5.8) 对于 shebang 行有不同的行为吗?新版的Perl如果传给perl命令会忽略shebang行吗?

【问题讨论】:

  • 从 cmd 行运行 which perl 以检查您实际使用的是什么。 chmod 755 script.pl; ./script.pl 从 shebang 强制 perl。
  • Perl 总是扫描 shebang 行以获取其他命令行参数,但它不会 exec 其他 Perl。 shebang 线的目标消费者是你的 shell。

标签: perl scripting shebang


【解决方案1】:

当您运行perl myscript.pl 时,这将启动perl 二进制文件并将myscript.pl 作为输入,然后运行。在这种情况下,您将总是从您的 $PATH 中获取第一个 perl 二进制文件,而不管 Perl 版本如何。正如mpapec在他的评论中所说,您可以使用命令which perl来确定这是哪个perl

当您运行./myscript.pl 时,您的shell 会查找shebang 行,如果存在,它会执行shebang 中列出的程序并将文件内容作为输入提供给它。 (如果没有,shell 本身会尝试处理文件的内容。)在这种情况下,无论 Perl 版本如何,您都会总是在 shebang 的路径中获得 perl

这是基本的 *nix 行为,在 Perl 版本之间没有改变(因为它首先不受 perl 管理)。

【讨论】:

  • 我相信./myscript.pl是内核查看前16位(在由shell分叉的进程中),如果它是#!,它会尝试运行(execl? ) ,如果失败了,shell 就会被击中。
猜你喜欢
  • 2013-01-20
  • 1970-01-01
  • 1970-01-01
  • 2015-01-15
  • 2017-09-08
  • 2019-05-16
  • 1970-01-01
  • 2023-03-23
  • 1970-01-01
相关资源
最近更新 更多