码
#!/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之间有什么区别?
潜伏在这里有两个问题.标题问题是" ./test.pl
和之间的区别是什么perl test.pl
?",而次要问题是"为什么在脚本运行时/root/Lib
添加到前面,而不是在运行时添加?"@INC
./test.pl
perl 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
了解更多详情.