【问题标题】:What means "not running under some shell" in Perl scripts?Perl 脚本中的“不在某个 shell 下运行”是什么意思?
【发布时间】:2012-02-26 23:03:30
【问题描述】:

在许多 perl 脚本中(尤其是在著名的 CPAN 发行版中),我发现以下代码:

eval 'exec /usr/bin/perl -w -S $0 ${1+"$@"}'
if 0; # not running under some shell

我想知道它是干什么用的?

谢谢。

【问题讨论】:

    标签: perl cpan


    【解决方案1】:

    某些系统无法识别脚本开头的#!/usr/bin/perl 行,因此尝试在此类系统上按名称调用 Perl 程序只会将脚本传递给 shell。为了解决这个问题,可移植的 Perl 程序以一行开头,当被标准 POSIX shell 解释时,会导致脚本被传递给perl(1)if 0 会导致该行在 Perl 自身运行时被忽略,并将其放在单独的行上会导致 shell 将其视为单独的命令,在读取时仅运行 eval 'exec /usr/bin/perl -w -S $0 ${1+"$@"}'

    【讨论】:

    • 非常感谢!真是太聪明了!
    • 不知道是否还有不支持shebangs的系统值得担心。
    • 我有执行此操作的脚本,以便它们可以在 Solaris 和 Linux 下运行。 shebang 指向 Solaris perl,但在 Linux 下,脚本作为 shell 执行,而 eval 行执行 Linux perl。 perls 安装在奇怪的位置,但文件/目录通过 NFS 在系统之间共享。
    【解决方案2】:

    该行在 shell 和 perl 下都有效。在 perl 中,eval 被跳过,因为跟随 if 0。在 shell 中,使用 eval 在perl 中执行相同的文件。

    【讨论】:

      猜你喜欢
      • 2019-03-18
      • 1970-01-01
      • 2013-12-03
      • 2012-04-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-06-22
      相关资源
      最近更新 更多