通过 sh 或 perl 调用 perl 脚本有什么区别

通过 sh 或 perl 调用 perl 脚本有什么区别

我有一个简单的 Hello World perl 脚本。

#!/usr/bin/perl

print 'Hello world.';

如果我通过 运行它,它工作正常perl <file_name>,但如果我通过 运行它,它会失败sh <file_name>

我对第一行的理解是它调用 perl shell(类似于 #!/usr/bin/bash 将调用 bash shell)。那么这两个命令到底有什么区别呢?

我找到了这个线程http://ubuntuforums.org/showthread.php?t=1133334其中指出sh <file_name> “在这种情况下,您根本不运行 Perl,而是运行 shell,它将调用程序‘print’。”如果是这样的话就是#!只是被解释为评论。如果是的话,还有必要吗?

(我知道我可以 chmod +x 文件并直接运行它,但我只想知道我使用的两种方法之间的区别)

答案1

如果直接执行文件

/path/to/script/filename

将搜索 shebang 行以查找解释器来运行它。如果您运行perlsh并附带参数,它们将按照文档所述的方式运行:分别尝试将文件解释为 Perl 或 shell 中的脚本。

当您从命令行显式设置解释器时(例如sh foo.plperl foo.pl)显式设置解释器时,shebang 行不会用于确定要运行的解释器。它解析可能的选项(例如使用 shebang #!/usr/bin/perl -w,运行脚本perl foo.pl将启用该-w标志),但它不用于确定哪个程序应解释该脚本。

因此,运行 perl 脚本意味着sh foo.pl您的系统将尝试将其解释为sh脚本,尽管有 perl shebang 行。

答案2

那么您还没有使脚本可执行吗? sh 不会自动假设具有这些文件扩展名的内容是可执行的,因此您要么需要运行perl <file name>,要么需要使其可执行chmod +x

答案3

这两者可能不一样,具体取决于 Perl 在您所使用的系统上的安装方式。尝试输入此命令:

which perl

它将显示您的可执行文件$PATH(键入echo $PATH以查看您的$PATH)中名为“perl”的路径。在许多系统上,这将是/usr/bin/perlPerl 通常安装的位置 - 这就是为什么大多数 Perl 脚本开头的“shebang”行也假定它在那里。

但在某些系统上,路径perl可能有所不同。在这种情况下,perl your_script.pl与使用 shell 解释 shebang 行相比,您可能会得到不同的结果,例如./your_script.pl;在前一种情况下,perl您的解释器$PATH将解释您的脚本,而在后一种情况下,解释器将随意解释/usr/bin/perl。这些可能不一样。

在许多情况下,perl是您自己安装的 Perl,可能比系统附带的更新(在 参考资料中/usr/bin)。换句话说,系统上有不止一个 Perl 解释器。在这种情况下,您最好弄清楚您想要哪一个,并将其路径硬编码到 shebang 行中,这样您的脚本就不会意外地被错误版本的 Perl 解释。 (您也可以use 5.12;在脚本中编写类似的内容,以提高这方面的安全性。)要检查 Perl 解释器的版本,请输入/path/to/perl -v

相关内容