“perl test.pl”和“./ test.pl”有什么区别?

时间:2012-08-15 13:52:41

标签: perl

我观察到有两种执行perl程序的方法:

perl test.pl

./test.pl

这两者之间的确切区别是什么,推荐哪一个?

6 个答案:

答案 0 :(得分:15)

我会稍微改述其他答案。

  • 第一种情况将运行名为“perl”的程序 - 可能是Perl语言解释器,并将值“test.pl”作为第一个参数传递给它。请注意,这将执行以下三种操作之一,具体取决于“perl”是什么以及“test.pl”是什么:

    1. 如果“perl”不是$PATH中的可执行文件或shell别名(通过运行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文件权限。 / 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

  • 向shell指定您希望当前的Perl可执行文件(如$ PATH中所示)执行位于$ PATH中的test.pl文件。
  • 运行 perl 以快速查看默认版本的perl
  • 运行 echo $ PATH 以查看“。”的位置(当前目录)是。所有目录都在'。'之前将首先检查test.pl文件!请使用./test.pl,以便shell只在当前目录中查找...除非您希望它在$ PATH中搜索test.pl文件。

<强> ./ test.pl

  • 在shell中指定您希望test.pl文件在当前目录中由test.pl文件中指定的可执行文件运行,该文件位于she-bang(以#!)。