我有一个简单的 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 文件并直接运行它,但我只想知道我使用的两种方法之间的区别)
如果直接执行文件
/path/to/script/filename
Run Code Online (Sandbox Code Playgroud)
将搜索 shebang 行以寻找解释器来运行它。如果你跑perl
或sh
带有参数,它们的行为将如文档所示:分别尝试将文件解释为 Perl 或 shell 中的脚本。
当您从命令行(例如sh foo.pl
或perl foo.pl
)显式设置解释器时,shebang 行不用于确定要运行的解释器。它被解析为可能的选项,(例如使用#!/usr/bin/perl -w
shebang,运行脚本perl foo.pl
将启用-w
标志),但它不用于确定哪个程序应该解释脚本。
因此,运行 perl 脚本sh foo.pl
意味着您的系统将尝试将其解释为sh
脚本,尽管有 perl shebang 行。