正如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东西所混淆.它究竟在做什么?
解决方法
第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