我观察到有两种执行perl程序的方法:
perl test.pl
和
./test.pl
这两者之间的确切区别是什么,推荐哪一个?
答案 0 :(得分:15)
我会稍微改述其他答案。
第一种情况将运行名为“perl”的程序 - 可能是Perl语言解释器,并将值“test.pl”作为第一个参数传递给它。请注意,这将执行以下三种操作之一,具体取决于“perl”是什么以及“test.pl”是什么:
如果“perl”不是$PATH
中的可执行文件或shell别名(通过运行which perl
检查),则shell将尝试查找不存在的可执行文件,并因perl: Command not found
错误而失败。
如果“perl”是您的路径中的可执行文件(或shell别名),它实际上不是Perl解释程序,那么它将被执行。例如,请在csh中尝试:
alias perl echo
which perl # Will print "perl: aliased to echo"
perl test.pl # Will print "test.pl". NOT what you intended!
unalias perl
这将执行您的“perl”别名,只需回显“test.pl”一词
如果“perl”是您的路径中的可执行文件,它是一个真正的perl解释器,它会将“test.pl”作为第一个参数传递给它。在这种情况下,Perl解释器会将此参数(因为它不以“ - ”开头)作为包含要执行的Perl代码的文件的名称,并尝试读取该文件,将其编译为Perl代码并执行它
请注意,由于正在运行的程序实际上是“perl”而“test.pl”只是一个正在读入的文本文件,因此“test.pl”不需要具有“执行”Unix文件权限。 / p>
第二种情况,shell将尝试在当前目录中找到名为“test.pl”的文件,并且 - 如果它存在并且是可执行的 - 尝试将其作为程序
如果文件不存在或者如果没有设置执行位,则shell将失败并显示“command not found”错误。
如果文件设置了执行位,shell(或Unix内核中的实际进程加载器)将尝试执行它。 Unix执行给定可执行文件的规则由文件的前2个字节控制,即“幻数”。
如果对魔术数字的工作方式有非常深入的了解,请参阅SO上的“How does the #! work?
”问题。
在特殊情况下,“幻数”是“#!” (又名“shebang”),加载器将读取文件的第一行,并将该行的内容(无前两个字节)视为要运行的命令而不是给定的可执行文件;并将可执行文件的路径作为从shebang行读取的命令的一个附加参数追加。例如:
如果“test.pl”是第一行#!/bin/sh -x
的文本文件,则内核将执行/bin/sh -x ./test.pl
。
如果“test.pl”是第一行#!/usr/bin/perl
的文本文件,则内核将执行/usr/bin/perl ./test.pl
。
如果“test.pl”是第一行#!perl
的文本文件,则内核将执行perl ./test.pl
。
如果“test.pl”是第一行my $var = 1;
的文本文件(或任何其他前两个字节,它不知道该怎么做),它将会输出错误或(至少在RedHat Linux上)会假装有一个隐含的#!/bin/sh
shebang并尝试将该文件作为Bourne Shell脚本执行。这当然会失败,因为它是Perl代码,而不是shell脚本
答案 1 :(得分:12)
在第一种情况下,您正在启动perl
解释程序并要求它使用您的文件并运行它。
在第二种情况下,您要求shell执行您的文件。这要求文件以
开头#!/<path to perl>/perl
并且该文件已设置执行位。
最好的使用方法是最适合您使用的方法。
答案 2 :(得分:4)
第一个将始终以perl
代码运行脚本
第二个只会在she-bang中指定perl的情况下执行此操作。否则它将作为shell代码或she-bang中指定的任何内容运行它(如果没有任何she-bang它将作为当前shell代码运行)。
即使启用noexec
挂载选项,也会执行第一个。
在这种情况下,第二个将失败。
与执行位相同的东西。如果未设置+x
,第二个将失败。
答案 3 :(得分:3)
第一个使用perl
中首先找到的$PATH
执行程序。第二个使用程序中的shebang行。
答案 4 :(得分:0)
如果您将可执行权限设置为该文件,则可以通过./运行该文件,或者使用perl filename.pl
运行该文件。答案 5 :(得分:-1)
perl test.pl
<强> ./ test.pl 强>