linux - ./test.pl 和 perl test.pl 之间的区别

标签 linux perl

代码

#!/usr/bin/perl -I/root/Lib/ 
use Data::Dumper;
print Dumper \@INC; 

以上代码文件名为test.pl,权限为755。

当我使用/usr/bin/perl test.pl 运行程序时,@INC 的输出最后包含“/root/Lib”。这就像插入@INC。

/usr/bin/perl test.pl 输出

$VAR1 = [
          '/etc/perl',
          '/usr/local/lib/perl/5.10.0',
          '/usr/local/share/perl/5.10.0',
          '/usr/lib/perl5',
          '/usr/share/perl5',
          '/usr/lib/perl/5.10',
          '/usr/share/perl/5.10',
          '/usr/local/lib/site_perl',
          '.',
          '/root/Lib/'
        ];

但是,当我使用 ./test.pl 运行程序时,@INC 的输出包含“/root/Lib/”,也包含 first 和 end。这就像 unshift 和 push。

./test.pl 输出

$VAR1 = [
          '/root/Lib/',
          '/etc/perl',
          '/usr/local/lib/perl/5.10.0',
          '/usr/local/share/perl/5.10.0',
          '/usr/lib/perl5',
          '/usr/share/perl5',
          '/usr/lib/perl/5.10',
          '/usr/share/perl/5.10',
          '/usr/local/lib/site_perl',
          '.',
          '/root/Lib/'
        ];

所以我想知道 ./test.pl 和/usr/bin/perl test.pl 有什么区别?

最佳答案

这里有两个问题。标题问题是“./test.plperl test.pl 有什么区别?”,而次要问题是“为什么 /root/当脚本作为 ./test.pl 运行时而不是作为 perl test.pl< 运行时,在 @INC 的前面添加了 Lib/?"

一个不一定适用于您的情况的答案是 ./test.pl 运行由 shebang (/usr/bin/perl) 指定的 Perl 解释器,而 perl test.pl 运行在 $PATH(或别名或函数)上首先找到的任何 Perl 解释器。这些不必是同一版本的 Perl。对我来说,它们很少是相同版本的 Perl; /usr/bin 中的通常相对较旧,而我的 $PATH 中的相对较新(例如,5.8.x 与 5.18.x)。

在我的机器上使用来自 /usr/bin 的 Perl 5.12.4(哎呀;那太旧了),并使用您的脚本,我看到:

$ perl test.pl
$VAR1 = [
          '/root/Lib/',
          '/Library/Perl/5.12/darwin-thread-multi-2level',
          '/Library/Perl/5.12',
          '/Network/Library/Perl/5.12/darwin-thread-multi-2level',
          '/Network/Library/Perl/5.12',
          '/Library/Perl/Updates/5.12.4',
          '/System/Library/Perl/5.12/darwin-thread-multi-2level',
          '/System/Library/Perl/5.12',
          '/System/Library/Perl/Extras/5.12/darwin-thread-multi-2level',
          '/System/Library/Perl/Extras/5.12',
          '.'
        ];
$ ./test.pl
$VAR1 = [
          '/root/Lib/',
          '/root/Lib/',
          '/Library/Perl/5.12/darwin-thread-multi-2level',
          '/Library/Perl/5.12',
          '/Network/Library/Perl/5.12/darwin-thread-multi-2level',
          '/Network/Library/Perl/5.12',
          '/Library/Perl/Updates/5.12.4',
          '/System/Library/Perl/5.12/darwin-thread-multi-2level',
          '/System/Library/Perl/5.12',
          '/System/Library/Perl/Extras/5.12/darwin-thread-multi-2level',
          '/System/Library/Perl/Extras/5.12',
          '.'
        ];
$

请注意,此处 /root/Lib 名称被添加到 @INC 中一次或两次。我最好的猜测是,当您使用 perl test.pl 时,Perl 会扫描 shebang 并在找到时添加 -I 选项。当你使用 ./test.pl 时,内核运行 /usr/bin/perl -I/root/Lib test.pl test.pl 出现在命令行中;关键是 -I/root/Lib 确实出现了),所以 Perl 添加了 /root/Lib 一次,因为内核提供了显式的 -I,然后添加另一个,因为它解析了 shebang 行。

参见:perldoc perlrun了解更多详情。

关于linux - ./test.pl 和 perl test.pl 之间的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17525479/

相关文章:

linux - 内核模块与使用新补丁重新编译的内核的兼容性

c++ - SDL - 窗口不显示任何内容

c++ - 如何在 Linux 上生成真正并行的任务

python - 如何添加到每行末尾附近的数字

Perl Term::ReadLine::Gnu 信号处理难点

perl - 使用 Perl 从输入中提取和过滤一系列行

c - 非法内存写入导致 recv() 返回零

perl - 需要帮助安装 MooseX::Declare

regex - Unix 文件处理删除垃圾字符

python - 为什么在 upstart 服务或守护进程服务中使用 user nobody nogroup