我对 Perl 比较陌生,并且正在处理其他人编写的 Perl 文件,并且在脚本的开头我不断遇到以下语句:
eval '(exit $?0)' && eval 'exec perl -w -S $0 ${1+"$@"}' && eval 'exec perl -w -S $0 $argv:q'
if 0;
这两条线有什么作用?什么是代码检查?if 0;
句子是做什么的?
这是 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 设置为某个值?但即使是这种情况并且$?
设置为非零值,除非将&&
其替换为||
. 有趣的事情正在发生。