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 "hin"; 和 #!/usr/bin/env perl print "hin"; 我不明白为什么程序不是无限循环.在上述任何一种情况下,shebang行都是或解析为perl解释器的绝对路径.这似乎是在Perl解析文件之后应该发生的下一件事情,通知shebang,并代表shebang路径(在这种情况下本身). perl比较shebang路径到自己的ARGV [0]? perl看看shebang字符串,看看它是否包含“perl”作为一个子字符串? 我试图使用符号链接来触发我期待的无限循环行为. $ln -s /usr/bin/perl /tmp/p #!/tmp/p print "hin"; 但是该程序打印“嗨”,不管它是如何被调用的. 然而,在OS X上,我能够将perl引入一个无限的shebang循环与脚本. / tmp / pscript的内容 #!/bin/sh perl "$@" perl脚本的内容 #!/tmp/pscript print "hin"; 并且这是无限循环(在OS X上,还没有在Linux上测试它). 在合理的情况下,perl显然要正确处理shebangs很麻烦.它不会被符号链接混淆,并不会被正常的env东西所混淆.它究竟在做什么? 解决方法
相关代码是
toke.c,Perl lexer.如果:
第1行以#开头(可选前面加空格)AND 跟随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,所以第二次不再满足最后一个条件,循环结束. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |