6

我对 Perl 比较陌生,并且正在处理其他人编写的 Perl 文件,并且在脚本的开头我不断遇到以下语句:

eval '(exit $?0)' && eval 'exec perl -w -S $0 ${1+"$@"}' && eval 'exec perl -w -S $0 $argv:q'
  if 0;

这两条线有什么作用?什么是代码检查?if 0;句子是做什么的?

4

1 回答 1

8

这是 exec hack 的变体。在解释器可以用 a 可靠地指定之前的日子里#!,它被用来制作 shell exec perl。第二if 0行的 永远不会被 shell 读取,它只读取第一行并执行 perl,它读取if 0并且不会重新执行自身。

这是一个有趣的变体,但我认为不太正确。它似乎设置为与 bourne shell 或 csh 变体一起使用,使用初始 eval 来确定解析它的 shell,然后使用适当的语法将参数传递给 perl。中间子句是 sh 语法,最后一个子句适用于 csh。如果第二个&&||并且最初的eval '(exit $?0)'确实在 csh 中失败了,那么这将实现这些目标,但正如所写的那样,我认为它对 csh 不太适用。在此之前是否有一个命令会$?根据 shell 设置为某个值?但即使是这种情况并且$?设置为非零值,除非将&&其替换为||. 有趣的事情正在发生。

于 2012-09-08T00:14:25.973 回答