本地化$ 0后显示原始args

时间:2011-10-12 18:28:42

标签: perl ubuntu centos ps argv

使用参数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。

2 个答案:

答案 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%可靠或可移植。

perldoc perlvar说:

  

在某些(但不是全部)操作系统上,分配到$ 0会修改   ps程序看到的参数区域。在某些平台上你可能有   使用特殊的ps选项或不同的ps来查看更改。   修改$ 0作为指示当前的方式更有用   程序状态,而不是隐藏你正在运行的程序。