gpt4 book ai didi

perl - Perl 如何避免 shebang 循环?

转载 作者:行者123 更新时间:2023-12-04 02:49:43 24 4
gpt4 key购买 nike

perl解释 shebang 本身并模仿 exec*(2) 的行为.我认为它模拟了 Linux 在所有空白上拆分的行为,而不是 BSD 的第一个空白唯一的东西,但没关系。

就像一个快速演示 really_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 时打印 hi .

此外,以下程序将执行正确的操作,无论它们是否被调用为 perl program./program .
#!/usr/bin/perl
print "hi\n";


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

我不明白为什么程序不是无限循环。在上述任何一种情况下,shebang 行要么是或解析为 perl 的绝对路径。口译员。似乎在那之后应该发生的下一件事是 perl解析文件,注意 shebang,并委托(delegate)给 shebang 路径(在本例中为本身)。是否 perl比较 shebang 路径和它自己的 ARGV[0] ?是否 perl查看 shebang 字符串,看看它是否包含 "perl"作为子字符串?

我尝试使用符号链接(symbolic link)来触发我所期望的无限循环行为。
$ ln -s /usr/bin/perl /tmp/p

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

但是该程序无论如何调用都会打印“hi”。

然而,在 OS X 上,我能够欺骗 perl进入带有脚本的无限shebang循环。
/tmp/pscript的内容
#!/bin/sh
perl "$@"

perl 脚本的内容
#!/tmp/pscript
print "hi\n";

这确实是无限循环(在 OS X 上,尚未在 Linux 上测试过)。
perl在合理的情况下正确处理shebangs显然会遇到很多麻烦。它不会被符号链接(symbolic link)混淆,也不会被普通 env 混淆东西。它到底在做什么?

最佳答案

相关代码在toke.c ,Perl 词法分析器。如果:

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

  • shebang 后面的程序使用 execv 执行.否则,词法分析器会继续运行; perl 没有 exec本身。

    结果,你可以用 shebang 做一些非常奇怪的事情,而无需 perl 尝试 exec另一个口译员:

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

    您的符号链接(symbolic link)示例满足上面列出的所有条件,那么为什么没有无限循环呢?您可以查看 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", "bar"], [/* 27 vars */]) = 0

    Perl 实际上是 exec链接,但因为它不包含 perl在名称中,第二次不再满足最后一个条件并且循环结束。

    关于perl - Perl 如何避免 shebang 循环?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38059830/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com