【问题标题】:/usr/bin/env perl does work as command but not in perl script/usr/bin/env perl 确实可以作为命令工作,但不能在 perl 脚本中使用
【发布时间】:2023-03-21 19:46:02
【问题描述】:

我有一个 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时也会出现这个错误。

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

【问题讨论】:

  • #!/usr/bin/env 不是 perl 命令。查找shebangs
  • 你能通过 hexdump 运行 shebang 行吗? head -n1 myscript.pl | xxd.
  • 文件 /usr/bin/env 是否存在于您的系统中,并且具有执行权限:ls -l /usr/bin/env
  • 能否请您发布此命令“echo $PATH”的结果?
  • 也许这是你的问题? askubuntu.com/q/372672

标签: bash perl unix shebang env


【解决方案1】:

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

【讨论】:

  • 谢谢!解决了,是新安装的软件出错忘记改了!
  • 值得注意的是,调用文件明确显示了这个问题,因为它显示了 perl 之后的尾随 \015 字符
【解决方案2】:

回答问题:

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

#!/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 程序员称它们为“系统 perl”。

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

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

【讨论】:

  • OP 已经知道 /usr/bin/env 做了什么。他们问为什么在脚本中使用它时会出错。这并没有回答他们的问题。
  • 实际上有两个问题:一个问是否有人可以解释在命令行或脚本中运行它时究竟有什么区别,另一个是他的脚本没有运行的原因。
  • 这不是解释命令行和脚本调用 Perl 的区别吗?
  • OP的问题其实是两个问题,一个可能是Windows到Linux文件传输导致的换行,另一个是理解脚本调用perl和命令行调用perl的区别。为什么我因为试图帮助解决第一个问题而被否决?这不是一个有效的问题吗?
  • 在回答不清楚或包含多个问题或隐含和显式问题的 SO 问题时,一个有用的策略可能是在引用中重新陈述您正在回答的问题(简洁!) (>) 放在答案的顶部,并清楚说明您没有回答的部分。如果您未能回答问题中的所有问题,您可能不会得到复选标记。但是你可能会因为你回答正确的部分而获得投票。 (不过,在这种情况下,您确实回答了问题中唯一的实际问题。为此 +1。)
最近更新 更多