2010-08-30 132 views
2

我有Perl脚本开始#!/usr/bin/perl#!/usr/bin/env perl调用Perl脚本

首先,什么是第二个版本是什么意思?

其次,我使用Ubuntu。所有的脚本都被设置为可执行文件。当我尝试通过简单地调用脚本来运行脚本(例如./script.pl)时,我得到: No such file or directory。当我通过perl ./script.pl调用它运行良好。

为什么?

+0

长镜头的位 - 他们是你从某处下载的脚本,并且你可能在文件而不是LF中获得了CR LF行尾。 – justintime 2010-08-30 08:52:06

+0

'哪个perl'说什么? – 2010-08-30 09:26:53

+0

'哪个perl'说'/ usr/bin/perl'。这些是我编写的脚本(并且仍在编写)。我只在Ubuntu上工作。 – 2010-08-30 11:30:40

回答

3

#!/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变种;-)

+0

脚本的第一行是'#!/ usr/bin/env perl'。我也尝试用'#!/ usr/bin/perl'替换它(它确实存在于我的系统中),但是也没有提供相同的错误信息。 – 2010-08-30 07:59:04

+0

@David B:哪些'env'和'哪个perl'说? – Dummy00001 2010-08-30 12:51:34

+0

@ Dummy00001:'$ which env' =>'/ usr/bin/env','$ which perl' =>'/ usr/bin/perl' – 2010-08-30 13:50:49

2

使用#!/usr/bin/env perl解决了每个系统上不一定在/usr/bin上的问题perl;它只是存在,使剧本更加便携


在一个相关的说明,您的第二个问题,有一个/usr/bin/perl和/或/usr/bin/env?如果没有,那就可以解释为什么直接运行脚本不起作用;如果您运行的脚本作为参数传递给perl

+2

只是为了澄清 - 如果运行'perl脚本'它会忽略shebang行中的任何路径,但它会查看行中的任何选项标志。 – justintime 2010-08-30 08:45:43

+2

只是为了澄清边缘情况下的说明:如果运行“perl脚本”,它会忽略shebang行中的任何路径(如果(且仅当)shebang行包含单词“perl”时)。如果你把“#!/ bin/sh”放在里面,perl足够聪明,可以为你执行sh。 – 2010-08-30 09:48:16