Ubuntu 中的 Perl 脚本无法在 Debian 上运行

Ubuntu 中的 Perl 脚本无法在 Debian 上运行

我有一个在 Ubuntu 20.04 LTS 上创建的 Perl 脚本。没问题并且有效。我把这个脚本放在另一台装有 Debian 的机器上。它不运行:

./my_script.pl

这给了我:./my_script.pl Command not found,虽然它适用于

perl my_script.pl

为什么?属性是-rwx--x--x,所以一切应该没问题。
我的舍邦是:#!/bin/perl

答案1

Debian 上 Perl 脚本的正确 shebang 是

#!/usr/bin/perl

这适用于 Ubuntu、Debian 和许多其他发行版和类 Unix 系统。

/bin/perl适用于你的 Ubuntu 系统,因为它合并了许多之间“共享”的/目录/usr,包括/bin/usr/bin,所以/usr/bin/perl也可用作/bin/perl

答案2

./my_script.pl=>Command not found
虽然它适用于perl my_script.pl

这表明您的脚本正在使用 Windows 样式的CR/LF行终止符,或者它可能以 UTF-8“BOM”签名开头。

您可以检查是否属于这种情况

cat -v ./my_script | sed 1q

^M并在末尾或M-oM-;M-?开头查找(回车符)。

例子:

$ cat ./script
#! /usr/bin/perl
print "hello\n"

$ perl ./script
hello

$ ./script
/bin/sh: 1: ./script: not found

$ cat -v ./script
#! /usr/bin/perl^M
print "hello\n"^M

Bash(但不是 dash)或大多数其他程序将使用更有用的错误消息,例如/usr/bin/perl^M: bad interpreter.

请注意,perl 本身并不关心脚本中的回车符;它只关心脚本中的回车符。它对待它们就像对待任何其他空白字符一样:

$ cat ./foo
print "hello\n"

$ perl ./foo
LOL

$ cat -v ./foo
print "LOL\n";^M#^Mprint "hello\n"

属性是-rwx--x--x,所以一切应该没问题。

这通常也是不行的。这样的脚本只能由其所有者使用。与可执行文件不同二进制文件, 可执行文件脚本也应该是可读的由执行它们的用户。

应改为-rwxr-xr-x( chmod 0755)。


我的舍邦是:#!/bin/perl

正如已经提到的,该 shebang 不可移植。请#! /usr/bin/perl改用(并确保它不以 结尾CR/LF,并且不包含其他“不可见”字符,例如 NUL、BOM 或双向标记;-))。

不要使用#! /usr/bin/env perl,因为这会打开一罐蠕虫;该脚本必须与用户路径中可能拥有的任何狂野 Perl 版本兼容,并且您将无法在之后添加任何默认参数perl(甚至不能--防止通过以 开头的符号链接调用脚本)破折号)。

答案3

很确定这是从一个盒子到另一个盒子的路径问题

which perl在 ubuntu 机器上运行,在 debian 机器上执行相同操作。

以及echo $PATH在两个盒子上运行。

尝试使用 perl 的完整路径运行它。

相关内容