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

mur*_*uga 9 linux perl

#!/usr/bin/perl -I/root/Lib/ 
use Data::Dumper;
print Dumper \@INC; 
Run Code Online (Sandbox Code Playgroud)

上面的代码文件名是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/'
        ];
Run Code Online (Sandbox Code Playgroud)

但是当我使用./test.pl运行程序时,@ INC的输出包含"/ root/Lib /"包含第一个也包含结尾.这就像不移动和推动.

./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/'
        ];
Run Code Online (Sandbox Code Playgroud)

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

Jon*_*ler 7

潜伏在这里有两个问题.标题问题是" ./test.pl和之间的区别是什么perl test.pl?",而次要问题是"为什么在脚本运行时/root/Lib添加到前面,而不是在运行时添加?"@INC./test.plperl test.pl

答案,不一定适用于您的情况,是./test.pl运行shebang(/usr/bin/perl)指定的Perl解释器,而perl test.pl运行首先在您的$PATH(或别名或函数)上找到的Perl解释器.这些不一定是Perl的相同版本.对我来说,它们很少是Perl的相同版本; 一个/usr/bin通常比较旧,而我的一个$PATH相对较新(例如,5.8.x vs 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',
          '.'
        ];
$
Run Code Online (Sandbox Code Playgroud)

请注意,此处将/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了解更多详情.