我有一个在 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 的完整路径运行它。