gpt4 book ai didi

perl - "perl test.pl"和 "./test.pl"有什么区别?

转载 作者:行者123 更新时间:2023-12-04 16:16:32 25 4
gpt4 key购买 nike

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

perl test.pl


./test.pl

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

最佳答案

我将稍微改写其他答案所说的内容。

  • 第一种情况将运行名为“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 文件权限。
  • 第二种情况,shell 将尝试在您的当前目录中找到一个名为“test.pl”的文件,并且 - 如果它存在并且是可执行的 - 尝试将它作为程序执行。
  • 如果文件不存在或文件上的执行位未设置,shell 将失败并显示“未找到命令”错误。
  • 如果文件设置了执行位,shell(或实际上 Unix 内核中的进程加载器)将尝试执行它。 Unix 执行给定可执行文件的规则由文件的前 2 个字节控制,也就是“魔数(Magic Number)”。

    有关神奇数字如何工作的非常深入的介绍,请参阅关于 SO 的“ How does the #! work? ”问题。
  • 在“魔数(Magic Number)”是“#!”的特殊情况下(又名“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 .
  • 如果“test.pl”是一个文本文件,第一行是 my $var = 1; (或任何其他它不知道如何处理的前 2 个字节),它要么出错,要么(至少在 RedHat Linux 上)假装存在隐含的 #!/bin/sh shebang 并尝试将文件作为 Bourne Shell 脚本执行。这当然会失败,因为它是 Perl 代码,而不是 shell 脚本
  • 关于perl - "perl test.pl"和 "./test.pl"有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11970541/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com