我有一个perl脚本,其中包含第一行如下:
#!/usr/bin/env perl
我已经读到执行这是为了在环境中找到perl。但是现在,当我在命令行上执行它时 /usr/bin/env perl
,perl 本身被执行(位于 /usr/bin/perl
)。但是当我使用 ./myscript.pl
启动脚本时,它显示以下错误:
/usr/bin/env: No such file or directory
这是因为它找不到perl
,因为当我键入/usr/bin/env xxxxxx
时也会出现此错误。
有人可以解释一下当我在命令行或脚本中运行它时到底有什么区别吗?
最可能的原因是您以某种方式在 myscript.pl
中获得了 DOS 行尾 (CRLF)。 这会导致env
搜索名为 perl^M
的文件(其中 ^M
表示 CR 字符),而您没有。
回答问题:
有人可以解释一下当我在命令行或脚本中运行它时到底有什么区别吗?
#!/usr/bin/env perl
这基本上是告诉操作系统(理解 shebang)在$PATH列表中找到第一个"perl"可执行文件,并通过在 shebang 后面附加当前文件名来执行该程序。它不会直接调用"perl",就像在大多数perl程序中找到的这个shebang
:#!/usr/bin/perl
这是因为大多数类UNIX系统(尤其是Linux)都带有安装在/usr/bin/perl的perl。有些UNIX默认没有perl,但可以很容易地安装在后面。只是它们可能最终位于/usr/local/bin/perl。通常perl程序员称它们为"system perl"。
第一个将采用您$PATH中的第一个perl,第二个将采用系统附带的perl。
如果您没有在 shell 上指定完整路径,那么它也会采用$PATH中第一个路径。