2012-08-15 71 views

回答

12

在第一种情况下,您将启动perl解释器,并要求它使用您的文件并运行它。

在第二种情况下,您要求您的shell执行您的文件。这要求文件以

#!/<path to perl>/perl 

开头,并且该文件具有设置的执行位。

最好的方法是使用最适合您的用例。

+0

通过执行位,你的意思的权限,正确的运行? – 2012-08-15 14:19:39

+0

@rad是的,如使用'chmod'命令设置它。 – HonkyTonk 2012-08-15 14:22:46

+0

好的,谢谢! – 2012-08-15 15:48:32

3

第一个程序使用在您的$PATH中首先找到的perl执行该程序。第二个在程序中使用shebang行。

4
  • 第一个将始终运行脚本作为perl代码。
    第二个只有在perl被指定在she-bang的情况下才会这样做。否则,它将运行它作为shell代码或she-bang中指定的任何内容(如果没有she-bang,它将作为当前shell代码运行)。

  • 第一个将被执行,即使noexec安装选项已启用。
    在这种情况下,第二个将失败。

  • 与执行位相同的东西。第一个将工作,如果+x没有设置,第二个将失败。

+0

您确定缺少shebang是“当前shell”代码而不是系统shell吗?它似乎是前者,但我不确定 – DVK 2012-08-15 16:18:08

15

我会稍微改述其他答案。

  • 第一种情况将运行名为“perl”的方案 - 大概,一个Perl语言解释器,并传递价值“test.pl”把它作为第一个参数。请注意,这会做3件事情之一,这取决于“perl的”是什么“test.pl”是:

    1. 如果用“Perl”并不为可执行在你$PATH或外壳存在别名(通过运行which perl进行检查),您的shell将尝试查找不存在的可执行文件,并失败并出现perl: Command not found错误。

    2. 如果“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“

    3. 如果”perl“是你的路径中的一个可执行文件,它是一个真正的perl解释器,它会通过”test.pl“作为第一个参数,在这种情况下,Perl解释器会将这个参数因为它不是以“ - ”开始)作为包含Perl代码的文件的名称来执行并尝试读取该文件,将其编译为Perl代码并执行它

      请注意,由于程序正在运行实际上是用“Perl”和“test.pl”只是读取在一个文本文件,“test.pl”并不需要有“执行” Unix文件权限。

  • 第二种情况,shell将尝试在当前目录中找到名为“test.pl”的文件,并且 - 如果它存在AND且可执行 - 请尝试将其作为程序执行。

    • 如果该文件不存在,或者如果它的执行位未设置,外壳将失败,错误“未找到命令”。

    • 如果该文件具有设置的执行位,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第一行的文本文件,内核将执行​​

      • 如果“test.pl”是的#!perl第一行的文本文件,内核将执行perl ./test.pl

      • 如果“test.pl”是第一行my $var = 1;(或任何其他第一个2字节它不知道该怎么处理)的文本文件,它将会出错或至少在RedHat Linux)会假装有一个暗示012bshebang,并尝试将该文件作为Bourne Shell脚本执行。这当然会失败,因为它是Perl代码,不是shell脚本

-1

perl的测试。PL

  • 指定到你想要的最新的Perl可执行文件(如$ PATH被发现)来执行位于$ PATH中test.pl文件中的壳。
  • 运行这perl的迅速看到什么版本的Perl是默认
  • 运行回声$ PATH,看看那里的“” (当前目录)是。 '。'之前的所有目录将首先检查test.pl文件!请使用./test.pl,以便shell仅查找当前目录...除非您希望它在$ PATH中搜索test.pl文件。

./test.pl

  • 指定到你想要的test.pl文件的外壳,在当前目录中,由可执行文件作为test.pl内指定运行文件在与她邦线(与#开头行!)。
+0

perl test.pl不会检查$ PATH。 – DVK 2013-07-19 13:04:00

0

如果妳设置可执行权限的文件,然后你可以通过./或运行该文件还用perl filename.pl