gpt4 book ai didi

shebang - Perl 如何处理 shebang 行?

转载 作者:行者123 更新时间:2023-12-01 15:20:51 27 4
gpt4 key购买 nike

我试图了解 perl 如何处理 shebang 行。

曾经认为命令行“命令位置”中提到的任何解释器都会优先于 shebang 行中提到的解释器。例如,如果一个名为 demo 的可执行脚本看起来像这样

#!/usr/local/bin/perl-5.00503

printf "$]\n";

...然后我会观察以下内容:

$ ./demo
5.00503
% /usr/local/bin/perl-5.22 ./demo
5.022003

IOW,在第一次执行中,shebang 中的解释器是正在运行的解释器,而在第二次执行中,它是命令行中提到的解释器。到目前为止一切顺利。

但是现在,如果我将 shebang 上的“解释器”更改为 /usr/bin/wc 之类的东西,那么它总是胜过任何 perl 我在命令行中提到的解释器:

% cat demo-wc
#!/usr/bin/wc

printf "$]\n";

% ./demo-wc # produces the expected behavior
4 3 31 ./demo-wc
% /usr/local/bin/perl-5.22 ./demo-wc
4 3 31 ./demo-wc
% /usr/local/bin/perl-5.14 ./demo-wc
4 3 31 ./demo-wc

AFAICT,这种特殊行为似乎受限于 perl 解释器;非 perl 解释器,例如 /bin/bash,会“否决”shebang:

% /bin/bash ./demo-wc
$]

底线是 perl 似乎有完全不同的政策来处理 shebang,这取决于所提到的解释器。


  1. perl 如何确定要遵循的策略?
  2. 这两种情况的具体政策是什么?

最佳答案

您的测试中有几种不同的情况。

当您使用 ./demo... 时,内核会在魔数(Magic Number)(前 16 位)中找到 #! 并运行该程序,或者通过该行如果失败则发送到 shell,它会启动它上面的内容。

但是当你在命令行调用 perl 时,perl 二进制文件由 shell 启动,然后 perl 解释器自己处理 shebang。在这种情况下,它会丢弃 perl 部分,但会考虑开关——如果该行包含“perl”。

如果shebang 调用perl,我们就有了Perl 特有的行为。来自 perlrun

If the #! line does not contain the word "perl" nor the word "indir", the program named after the #! is executed instead of the Perl interpreter. This is slightly bizarre, but it helps people on machines that don't do #!, because they can tell a program that their SHELL is /usr/bin/perl, and Perl will then dispatch the program to the correct interpreter for them.

关于shebang - Perl 如何处理 shebang 行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45949339/

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