3

使用 arguments 运行时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。

4

2 回答 2

1

将以下内容放在程序的顶部:

$0 = "perl $0 @ARGV";
于 2011-10-12T19:09:23.300 回答
0

有趣的。我只是尝试了类似的东西,显示了$0before invoking的值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

so$0恢复到原来的值,但是打印出来的信息ps不一样。

请注意,@EricStrom 的解决方法并不完全具有(大概)预期的结果;它使ps命令名称显示为perl,而不是/usr/bin/perl(后者可能是有用的信息)。

看起来 Perl 正在尝试恢复$0到它的原始值,但它并没有完全成功地恢复ps.

我认为底线是修改$0可能有用,但行为不是 100% 可靠或可移植的。

perldoc perlvar说:

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

于 2011-10-12T20:09:39.423 回答