我有Perl脚本开始#!/usr/bin/perl
或#!/usr/bin/env perl
调用Perl脚本
首先,什么是第二个版本是什么意思?
其次,我使用Ubuntu。所有的脚本都被设置为可执行文件。当我尝试通过简单地调用脚本来运行脚本(例如./script.pl
)时,我得到: No such file or directory
。当我通过perl ./script.pl
调用它运行良好。
为什么?
我有Perl脚本开始#!/usr/bin/perl
或#!/usr/bin/env perl
调用Perl脚本
首先,什么是第二个版本是什么意思?
其次,我使用Ubuntu。所有的脚本都被设置为可执行文件。当我尝试通过简单地调用脚本来运行脚本(例如./script.pl
)时,我得到: No such file or directory
。当我通过perl ./script.pl
调用它运行良好。
为什么?
的#!/usr/bin/env perl
使用标准的POSIX工具env
解决“问题”是UNIX不支持家当线相对路径(据我所知)的家当不被处理。可以使用env
工具在修改环境变量后启动程序(本例中为perl)。在这种情况下,不会修改任何变量,然后env
将搜索Perl的PATH并运行它。因此,即使Perl未安装在/usr/bin
中,但在其他某个路径(必须位于PATH变量中)中,具有该特定shebang行的脚本也能正常工作。
然后,你的问题./script.pl
不工作:你说它有可执行的位设置,就像chmod +x script.pl
?但它是否也以一个shebang(#!
)行开始?也就是说,前两个字节必须是#!
,并且后面必须跟一个文件路径(到perl)。有必要告诉内核运行这个脚本的程序。如果你这样做了,路径是否正确?你想尝试#!/usr/bin/env perl
变种;-)
脚本的第一行是'#!/ usr/bin/env perl'。我也尝试用'#!/ usr/bin/perl'替换它(它确实存在于我的系统中),但是也没有提供相同的错误信息。 – 2010-08-30 07:59:04
@David B:哪些'env'和'哪个perl'说? – Dummy00001 2010-08-30 12:51:34
@ Dummy00001:'$ which env' =>'/ usr/bin/env','$ which perl' =>'/ usr/bin/perl' – 2010-08-30 13:50:49
使用#!/usr/bin/env perl
解决了每个系统上不一定在/usr/bin
上的问题perl
;它只是存在,使剧本更加便携
在一个相关的说明,您的第二个问题,有一个/usr/bin/perl
和/或/usr/bin/env
?如果没有,那就可以解释为什么直接运行脚本不起作用;如果您运行的脚本作为参数传递给perl
只是为了澄清 - 如果运行'perl脚本'它会忽略shebang行中的任何路径,但它会查看行中的任何选项标志。 – justintime 2010-08-30 08:45:43
只是为了澄清边缘情况下的说明:如果运行“perl脚本”,它会忽略shebang行中的任何路径(如果(且仅当)shebang行包含单词“perl”时)。如果你把“#!/ bin/sh”放在里面,perl足够聪明,可以为你执行sh。 – 2010-08-30 09:48:16
长镜头的位 - 他们是你从某处下载的脚本,并且你可能在文件而不是LF中获得了CR LF行尾。 – justintime 2010-08-30 08:52:06
'哪个perl'说什么? – 2010-08-30 09:26:53
'哪个perl'说'/ usr/bin/perl'。这些是我编写的脚本(并且仍在编写)。我只在Ubuntu上工作。 – 2010-08-30 11:30:40