/usr/bin/env perl 可以作为命令使用,但不能在 perl 脚本中使用

/usr/bin/env perl does work as command but not in perl script

我有一个 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.

也会出现这个错误

有人可以解释一下当我在命令行或脚本中 运行 它到底有什么区别吗?

回答问题:

Can somebody explain me what exactly is the difference when I run it on command line or in a script?

#!/usr/bin/env perl

这基本上告诉 OS(理解 shebang)在 $PATH 列表中找到第一个 "perl" 可执行文件,并通过在shebang。它不直接调用 "perl",就像你在大多数 perl 程序中会发现的这个 shebang:

#!/usr/bin/perl

这是因为大多数 UNIX-like 系统(尤其是 Linux)在 /usr/bin/perl 上安装了 perl。一些 UNIX 默认没有 perl,但可以很容易地在以后安装。只是他们最终可能会在 /usr/local/bin/perl。通常 perl 程序员称它们为 "system perl".

第一个将使用您的 $PATH 中的第一个 perl,第二个将使用您的系统附带的那个。

如果您没有在 shell 上指定完整路径,那么它也会采用您 $PATH 中第一个的任何内容。

最可能的原因是您以某种方式在 myscript.pl 中获得了 DOS 行结尾 (CRLF)。这导致 env 搜索名为 perl^M 的文件(其中 ^M 代表一个 CR 字符),而您没有。