【问题标题】:How to get the running Perl script's path and name (argv[0] in C)如何获取正在运行的 Perl 脚本的路径和名称(C 中的 argv[0])
【发布时间】:2011-03-12 03:49:17
【问题描述】:

在 C / C++(也是 bash?)中,第一个命令行参数 argv[0] 是二进制文件名(以用户调用的绝对或相对路径为前缀)。

在 Perl 中,第一个命令行参数 $ARGV[0] 是脚本路径和名称之后的第一个命令行参数。

Perl 脚本如何获取用于调用它的路径和名称?

谢谢!

【问题讨论】:

    标签: perl command-line-arguments


    【解决方案1】:

    $0 包含包含正在执行的 perl 脚本的文件的名称。

    【讨论】:

      【解决方案2】:

      “在 C / C++(也是 bash?)中,第一个命令行参数 argv[0] 是二进制文件名”

      顺便说一句,

      大错特错。 ISO 标准没有规定这样的事情。

      来自 C99:

      如果argc的值大于零,则argv[0]指向的字符串代表程序名;如果主机环境中没有程序名称,则 argv[0][0] 应为空字符。

      请注意,它声明“代表程序名称”,而不是“是二进制可执行文件的位置”。那是因为有一个更早的 sn-p 声明:

      ...数组成员 argv[0] 到 argv[argc-1] 应包含指向字符串的指针,这些指针在程序启动之前由宿主环境赋予实现定义的值。”

      对于您的argv[0],命令“sleep 60”是“pax 的神奇睡眠实用程序”而不是“/bin/sleep”是完全合法的。

      简而言之,环境不必提供程序的表示形式,即使提供,也不必是可用于定位二进制文​​件的任何东西。


      但是,由于我的辱骂让你感到厌烦,Perl 为此提供了$0$PROGRAM_NAME(在那种可怕的“英语”模式下)。详情请见perlvar

      【讨论】:

      • 好的,好的。我想我并不是在寻找完美的便携性。顺便说一句,POSIX 是否说明了 argv[0] 包含的内容?
      • 我不应该将此 argv 行为与 C 或任何高级语言相关联。这是 POSIX.1 所说的:opengroup.org/onlinepubs/009695399/functions/exec.html 参数 argv 是指向以空字符结尾的字符串的字符指针数组。应用程序应确保该数组的最后一个成员是空指针。这些字符串应构成可用于新过程映像的参数列表。 argv[0] 中的值应该指向一个文件名,该文件名与正在由 exec 函数之一启动的进程相关联。
      • 没有问题,浦项制铁,我只是想我会提出来。当有人谈论 C 标准时,它总是意味着 ISO - POSIX 是下一个级别,可以这么说。无论如何,一旦您习惯了将标准文档(以及我们的需求文档)放在一起的“语言律师”,您就会意识到“应该”和“应该”具有非常具体的含义。 “Shall”表示它 的情况,而“should”仅表示它应该 是这种情况,但不一定。请参阅 POSIX 也遵循的 ISO/IEC 指令的附录 H:iec.ch/tiss/iec/Directives-Part2-Ed5.pdf
      猜你喜欢
      • 2011-06-03
      • 1970-01-01
      • 1970-01-01
      • 2021-04-10
      • 2010-09-10
      • 2010-11-29
      • 2010-10-10
      • 2011-07-08
      相关资源
      最近更新 更多