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

Dav*_*ave 7 perl shell-script

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

#!/usr/bin/perl

print 'Hello world.';
Run Code Online (Sandbox Code Playgroud)

如果我通过 运行它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,它会调用程序‘打印’。” 如果是这种情况,则 #! 只是被解释为评论。如果是这样,它是否完全需要?

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

cho*_*oba 6

如果直接执行文件

/path/to/script/filename
Run Code Online (Sandbox Code Playgroud)

将搜索 shebang 行以寻找解释器来运行它。如果你跑perlsh带有参数,它们的行为将如文档所示:分别尝试将文件解释为 Perl 或 shell 中的脚本。

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

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