使用参数a b c d e f g
运行时,此脚本:
system("ps ww$$");
{
local $0 = "foo";
system("ps ww$$");
}
system("ps ww$$");
打印如下内容:
PID TTY STAT TIME COMMAND
16057 pts/5 S+ 0:00 perl /tmp/u a b c d e f g
PID TTY STAT TIME COMMAND
16057 pts/5 S+ 0:00 foo
PID TTY STAT TIME COMMAND
16057 pts/5 S+ 0:00 /tmp/u
换句话说,在第三种情况下ps
不显示原始的argv数组。
是否可以通过a b c d e f g
恢复/显示原始参数(例如ps
)?
我正在使用Centos和Ubuntu。
答案 0 :(得分:1)
将以下内容放在程序的顶部:
$0 = "perl $0 @ARGV";
答案 1 :(得分:0)
有趣。我刚尝试过类似的东西,在调用$0
之前显示ps
的值。
这是我的剧本:
#!/usr/bin/perl
use strict;
use warnings;
$| = 1;
print "\$0 = $0\n";
system 'ps', "ww$$";
print "\n";
{
local $0 = 'foo';
print "\$0 = $0\n";
system 'ps', "ww$$";
print "\n";
}
print "\$0 = $0\n";
system 'ps', "ww$$";
这是输出(第一个$
是shell提示符):
$ ./foo.pl
$0 = ./foo.pl
PID TTY STAT TIME COMMAND
2478 pts/2 S+ 0:00 /usr/bin/perl ./foo.pl
$0 = foo
PID TTY STAT TIME COMMAND
2478 pts/2 S+ 0:00 foo
$0 = ./foo.pl
PID TTY STAT TIME COMMAND
2478 pts/2 S+ 0:00 ./foo.pl
因此$0
恢复为原始值,但ps
打印的信息不同。
请注意,@ EricStrom的解决方法并不完全具有(推测)预期的结果;它使ps
将命令名称显示为perl
,而不是/usr/bin/perl
(后者可能是有用的信息)。
Perl似乎正在尝试将$0
恢复为原始值,但它无法成功恢复ps
所显示的信息。
我认为最重要的是修改$0
可能很有用,但行为不是100%可靠或可移植。
在某些(但不是全部)操作系统上,分配到$ 0会修改 ps程序看到的参数区域。在某些平台上你可能有 使用特殊的ps选项或不同的ps来查看更改。 修改$ 0作为指示当前的方式更有用 程序状态,而不是隐藏你正在运行的程序。