Joh*_*den 8 shell perl shebang
显然,这同样适用于替换perl的python,bash,sh等!
昆汀在下面的答案显然是正确的,所以我接受了它,但我想我的意思是'两种使用方式的优缺点是什么#!调用perl/python/bash作为脚本的解释器?'
这些是很好的规则,如果你有充分的理由打破它们,请不要犹豫:
#!/usr/bin/env perl尽可能使用异构系统之间的可移植性.但这是一种愚蠢的方式,因为它假设路径中第一个Perl也是你一直想要的Perl.可能不是这样,通常当系统上存在多个Perls时,由于某种原因它们就在那里.
更好的方法是在支持CPAN的发行版中打包脚本.分发发行版到要安装它们,并以通常的方式(手动或使用CPAN工具链)安装这些系统,specifiying的完整路径来perl或cpan.在此过程中,shebang行被重写为Perl的正确路径.
例子:
tar -xvf Local-OurCompany-Scripts-1.000.tar.gz
cd Local-OurCompany-Scripts-1.000
## automated installation
/usr/bin/cpan .
# or perhaps
/opt/ourcompany/perls/perl-5.14.2/bin/cpan .
## manual installation
/usr/bin/perl Makefile.PL ; make ; make install
# or perhaps
`which perl5.14.2` Makefile.PL ; make ; make install
Run Code Online (Sandbox Code Playgroud)
使用env查找可执行文件,而不是自己查找它,会执行额外的 exec,但这在大多数情况下并不重要。很方便,我自己也经常用。
env但是,我在系统脚本中使用的人遇到了问题。有一次,安装一个/usr/local/bin/perl版本破坏了我的系统,因此在解决问题之前我无法再更新它。还有一次,安装/usr/local/bin/python破坏了我正在使用的 ID3 标记器。我认为这更多的是一个包装问题,而不是env. 如果你要在系统上安装某些东西,如果你每次都留下一条 shebang 行来寻找任何旧版本的 Python,为什么要仔细检查它是否有一个满足你所有依赖项的 Python 版本呢?它是运行吗?