【问题标题】:What is the difference between "perl test.pl" and "./test.pl"?“perl test.pl”和“./test.pl”有什么区别?
【发布时间】:2012-08-15 13:52:41
【问题描述】:

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

perl test.pl

./test.pl

这两者的具体区别是什么,哪一个值得推荐?

【问题讨论】:

    标签: perl


    【解决方案1】:

    我会稍微改一下其他答案所说的内容。

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

        1234563 987654324@ 错误。
    • 如果 "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文件权限。

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

      • 如果文件不存在或者没有设置执行位,shell 将失败并出现“command not found”错误。

      • 如果文件设置了执行位,shell(或者实际上是 Unix 内核中的进程加载器)将尝试执行它。 Unix 执行给定可执行文件的规则由文件的前 2 个字节控制,也就是“幻数”。

        如需深入了解幻数的工作原理,请参阅 SO 上的“How does the #! work?”问题。

      • 在“幻数”为“#!”的特殊情况下(又名“shebang”),加载程序将读取文件的第一行,并将该行的内容(无前 2 个字节)视为要运行的命令,而不是给定的可执行文件;并将可执行文件的路径作为另一个参数附加到它从 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

        • 1234563至少在 RedHat Linux 上)会假装存在隐含的 #!/bin/sh shebang 并尝试将文件作为 Bourne Shell 脚本执行。当然会失败,因为它是 Perl 代码,而不是 shell 脚本

    【讨论】:

      【解决方案2】:

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

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

      开头
      #!/<path to perl>/perl
      

      并且该文件已设置执行位。

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

      【讨论】:

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

        • 即使启用了noexec 挂载选项,也会执行第一个。
          在这种情况下,第二个将失败。

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

        【讨论】:

        • 你确定缺少shebang是“当前shell”代码而不是系统shell吗?似乎是前者,但我不确定
        【解决方案4】:

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

        【讨论】:

          【解决方案5】:

          如果你设置了文件的可执行权限,那么你可以通过./运行文件,或者使用perl filename.pl运行

          【讨论】:

            【解决方案6】:

            perl test.pl

            • 向 shell 指定您希望当前 Perl 可执行文件(在 $PATH 中找到)执行位于 $PATH 中的 test.pl 文件。
            • 运行 which perl 快速查看默认的 perl 版本
            • 运行 echo $PATH 以查看 '.' 的位置(当前目录)是。 '.' 之前的所有目录将首先检查 test.pl 文件!请改用 ./test.pl,这样 shell 只会在当前目录中查找...除非您希望它在 $PATH 中寻找 test.pl 文件。

            ./test.pl

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

            【讨论】:

            • perl test.pl 不会检查 $PATH。
            猜你喜欢
            • 2013-07-05
            • 1970-01-01
            • 2016-02-12
            • 1970-01-01
            • 2020-10-15
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2010-12-23
            相关资源
            最近更新 更多