【发布时间】: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 发行版中),我发现以下代码:
eval 'exec /usr/bin/perl -w -S $0 ${1+"$@"}'
if 0; # not running under some shell
我想知道它是干什么用的?
谢谢。
【问题讨论】:
某些系统无法识别脚本开头的#!/usr/bin/perl 行,因此尝试在此类系统上按名称调用 Perl 程序只会将脚本传递给 shell。为了解决这个问题,可移植的 Perl 程序以一行开头,当被标准 POSIX shell 解释时,会导致脚本被传递给perl(1)。 if 0 会导致该行在 Perl 自身运行时被忽略,并将其放在单独的行上会导致 shell 将其视为单独的命令,在读取时仅运行 eval 'exec /usr/bin/perl -w -S $0 ${1+"$@"}'。
【讨论】:
该行在 shell 和 perl 下都有效。在 perl 中,eval 被跳过,因为跟随 if 0。在 shell 中,使用 eval 在perl 中执行相同的文件。
【讨论】: