perl - 新服务器上 $0 Perl 变量的变化
问题描述
由于硬件问题,我最近迁移到了新服务器。旧服务器和新服务器一样运行 Centos 7。我不记得旧服务器上的 Perl 版本,但我相信它与新版本(5.16.3)相同。我所有的 Perl 脚本在新服务器上运行良好,但有一个区别。旧服务器上的 $0 变量只返回脚本名称,但是,在新服务器上它返回完整路径以及脚本名称。
有谁知道是否有一个配置设置在某个地方控制这个或者为什么 Perl 会在新服务器和旧服务器上以不同的方式设置这个变量?
谢谢!
解决方案
$0
正是提供给perl
.
$ cat a.pl
#!/usr/bin/perl
use feature qw( say );
say $0;
$ perl a.pl
a.pl
$ perl ./a.pl
./a.pl
$ perl ././././a.pl
././././a.pl
$ perl /home/ikegami/a.pl
/home/ikegami/a.pl
如果脚本作为可执行文件运行,这通常正是提供exec
给执行程序的内容。[1]
$ a.pl
./a.pl <-- "." comes from $PATH.
$ ./a.pl
./a.pl
$ ././././a.pl
././././a.pl
$ /home/ikegami/a.pl
/home/ikegami/a.pl
如果您只想要程序名称,可以使用File::Basename的basename
.
例如,
use File::Basename qw( basename );
sub usage {
warn(@_) if @_;
my $prog = basename($0);
warn("Try `$prog --help' for help\n");
exit(1);
}
- 特别是,对于 setuid 脚本,期待一些奇怪的东西。
推荐阅读
- stripe-payments - 使用非零 unit_amount_decimal 创建结帐会话会返回不推荐使用金额字段的错误消息
- r - R:使用优化的指数混合的最大似然估计
- jenkins - 将触发器和夜间构建在一起有意义吗?
- botframework - 需要一些关于如何正确使用机器人框架 SDK 的指导
- amazon-s3 - 如何使用 Lambda /API Gateway 在 S3 上上传大于 10MB 的 csv 文件
- java - DSS 框架和 PDFBox 将签名摘要迁移到 PDF
- sql - 一条记录中的均值、标准和计数
- python - 如何在 Windows 的 Waitress 中获取 Flask 应用程序的 logger.info?
- c# - 如何设置电源和睡眠设置?
- python - 在 python 2d 列表中选择一些行