如何获取正在运行的Perl脚本的路径和名称(类似于C中的argv [0])

3
在C / C++(还有bash?)中,第一个命令行参数argv [0]是二进制文件名(由用户调用时前缀为绝对或相对路径)。
在Perl中,第一个命令行参数$ARGV [0]是路径和脚本名称之后的第一个命令行参数。
Perl脚本如何获取用于调用它的路径和名称?
谢谢!
2个回答

8

$0 包含正在执行的 Perl 脚本所在的文件名。


6
顺便说一下,“在C/C++(bash也是吗?)中,第一个命令行参数argv[0]是二进制文件名”是完全错误的。ISO标准没有这样的规定。根据C99,如果argc的值大于零,则argv[0]指向的字符串表示程序名称;如果主机环境不提供程序名称,则argv [0] [0]应为null字符。请注意,它声明“表示程序名称”,而不是“是二进制可执行文件的位置”。这是因为有一个早期的片段说明:“......数组成员argv [0]到argv [argc-1]包括应包含指向字符串的指针,在程序启动之前由主机环境赋予实现定义的值。”对于命令“sleep 60”的argv [0]可以是“pax的fantastic sleep utility”,而不是“/bin/sleep”。简而言之,环境不必提供程序的表示,即使它这样做,也不必提供任何可用于定位二进制文件的内容。

不过,废话不多说,对于这个目的,Perl 提供了 $0$PROGRAM_NAME(在那种可怕的“英语”模式下)。有关详细信息,请参见 perlvar


好的,没问题。我想我并不是在寻找完美的可移植性。顺便问一下,POSIX 是否有规定 argv[0] 包含什么内容? - Posco Grubb
我不应该将这个argv行为与C或任何高级语言联系起来。以下是POSIX.1的规定:http://www.opengroup.org/onlinepubs/009695399/functions/exec.html参数argv是一个指向以空字符结尾的字符串的字符指针数组。应用程序必须确保该数组的最后一个成员是空指针。这些字符串应构成新进程映像可用的参数列表。 argv [0]中的值应指向与通过exec函数之一启动的进程相关联的文件名。 - Posco Grubb
没问题,Posco,我只是想提一下。当有人谈论C标准时,通常指的是ISO - POSIX则是更高级别的标准。无论如何,一旦你习惯了编写标准文档(和我们的需求文档)的“语言律师”,你就会意识到“shall”和“should”有非常具体的含义。“Shall”表示它是这样的,而“should”仅表示它应该是这样的,但不一定是这样的。请参见ISO/IEC指令的附录H,POSIX也遵循此指令:http://www.iec.ch/tiss/iec/Directives-Part2-Ed5.pdf - paxdiablo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接