我有一个简单的 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 行以查找解释器来运行它。如果您运行perl
或sh
并附带参数,它们将按照文档所述的方式运行:分别尝试将文件解释为 Perl 或 shell 中的脚本。
当您从命令行显式设置解释器时(例如sh foo.pl
或perl 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/perl
Perl 通常安装的位置 - 这就是为什么大多数 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
。