Perl如何避免shebang循环?

前端之家收集整理的这篇文章主要介绍了Perl如何避免shebang循环?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
perl解释shebang本身并模仿exec *的行为(2).我认为它模拟了在所有空格分割而不是BSD第一个空白的东西的 Linux行为,但不介意.

正如quick_python.pl的快速演示一样

#!/usr/bin/env python

# the following line is correct Python but not correct Perl
from collections import namedtuple
print "hi"

当以perl really_python.pl调用时打印好.

此外,以下程序将会做正确的事情,无论它们是否被调用为perl程序或./program.

#!/usr/bin/perl
print "hi\n";

#!/usr/bin/env perl
print "hi\n";

我不明白为什么程序不是无限循环.在上述任何一种情况下,shebang行都是或解析为perl解释器的绝对路径.这似乎是在Perl解析文件之后应该发生的下一件事情,通知shebang,并代表shebang路径(在这种情况下本身). perl比较shebang路径到自己的ARGV [0]? perl看看shebang字符串,看看它是否包含“perl”作为一个子字符串?

我试图使用符号链接来触发我期待的无限循环行为.

$ln -s /usr/bin/perl /tmp/p

#!/tmp/p
print "hi\n";

但是该程序打印“嗨”,不管它是如何被调用的.

然而,在OS X上,我能够将perl引入一个无限的shebang循环与脚本.

/ tmp / pscript的内容

#!/bin/sh
perl "$@"

perl脚本的内容

#!/tmp/pscript
print "hi\n";

并且这是无限循环(在OS X上,还没有在Linux上测试它).

在合理的情况下,perl显然要正确处理shebangs很麻烦.它不会被符号链接混淆,并不会被正常的env东西所混淆.它究竟在做什么?

解决方法

相关代码toke.c,Perl lexer.如果:

第1行以#开头(可选前面加空格)AND
>不包含perl-AND
>不包含perl(除非后面是6,即perl6)AND
>(在“DOSish”平台上)不包含perl(例如Perl)AND的不区分大小写的匹配项
>不包含indir AND
>在命令行AND上没有设置-c标志
> argv [0]包含perl

跟随shebang的程序是用execv执行的.否则,词法分析器只是继续; perl不执行

结果,你可以做一些非常奇怪的事情与shebang没有perl试图执行另一个口译员:

#!     perl
#!foo perl
#!fooperlbar -p
#!perl 6
#!PeRl          # on Windows

您的符号链接示例符合上面列出的所有条件,所以为什么不会有无限循环?你可以看到strace发生了什么:

$ln -s /usr/bin/perl foo
$echo '#!foo' > bar
$strace perl bar 2>&1 | grep exec
execve("/bin/perl",["perl","bar"],[/* 27 vars */]) = 0
execve("foo",["foo",[/* 27 vars */]) = 0

Perl实际上执行链接,但是由于它不包含名称中的perl,所以第二次不再满足最后一个条件,循环结束.

猜你在找的Perl相关文章