【发布时间】:2011-03-12 03:49:17
【问题描述】:
在 C / C++(也是 bash?)中,第一个命令行参数 argv[0] 是二进制文件名(以用户调用的绝对或相对路径为前缀)。
在 Perl 中,第一个命令行参数 $ARGV[0] 是脚本路径和名称之后的第一个命令行参数。
Perl 脚本如何获取用于调用它的路径和名称?
谢谢!
【问题讨论】:
标签: perl command-line-arguments
在 C / C++(也是 bash?)中,第一个命令行参数 argv[0] 是二进制文件名(以用户调用的绝对或相对路径为前缀)。
在 Perl 中,第一个命令行参数 $ARGV[0] 是脚本路径和名称之后的第一个命令行参数。
Perl 脚本如何获取用于调用它的路径和名称?
谢谢!
【问题讨论】:
标签: perl command-line-arguments
$0 包含包含正在执行的 perl 脚本的文件的名称。
【讨论】:
顺便说一句,“在 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。
【讨论】: