我的Perl脚本在几个操作系统下运行,包括unix和Win32。在每个操作系统上都有唯一的Perl设置,其中perl解释器位于不同的目录下。
有没有办法在shebang线上指定解释器,如:
#!which perl
答案 0 :(得分:6)
使用常规CPAN工具安装脚本。在构建期间,它们使用您用于运行构建脚本的perl并将其插入到shebang行中。此外,您将确保您使用的perl已安装依赖项。
例如,您位于脚本的顶部:
#!perl
使用常规模块分发流程(请参阅我的App::PPI::Dumper作为示例),
$ perl5.10.0 Makefile.PL
安装它,ExtUtils::Makemaker或Module::Build使用您在构建脚本中使用的perl路径重写shebang:
#!/usr/local/perls/perl-5.10.0-rc2/bin/perl
eval 'exec /usr/local/perls/perl-5.10.0-rc2/bin/perl -S $0 ${1+"$@"}'
if 0; # not running under some shell
当您将脚本作为完整发行版分发时,您可以免费获得所有工具链功能,例如自动安装依赖项。它让生活更轻松。
答案 1 :(得分:3)
在某些unix上(可能是像Cygwin和MinGW / Msys这样)你可以使用env在PATH上搜索perl,如下所示:
#!/usr/bin/env perl
答案 2 :(得分:2)
使用的一个技巧是拥有一行
#!/usr/bin/env perl
无论位于何处,都会为您运行Perl。
但是...... 你应该注意,如果系统上有多个Perl解释器,这可能会导致问题。例如,我使用Ubuntu linux和Perl是系统的一个组件。但由于Debian人员做出了一些可疑的设置决定,Ubuntu系统Perl解释器的状态不佳,所以安装像CPAN模块这样的东西很棘手。因此,我总是在我的用户空间中使用自己编译的perl来完成自己的工作。一些Ubuntu Perl脚本使用上面的形式,因此如果我碰巧从命令行运行它们就会中断,因为我的perl解释器在Ubuntu默认Perl的路径中领先。
答案 3 :(得分:1)
man perlrun命令为这个问题提供了一些答案,但没有一个是完全可移植的。
答案 4 :(得分:0)
这在http://www.perlmonks.org/index.pl?node_id=118460
进行了讨论简而言之,无论你做什么,你最终都会在某个时刻假设一个二进制路径,如果/usr/bin/perl
不起作用,那么Perl就会被错误配置。
(Windows并不关心shebang系列)