【问题标题】:displaying original args after localizing $0本地化 $0 后显示原始参数
【发布时间】:2011-12-06 09:08:30
【问题描述】:

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

有没有办法可以通过ps恢复/显示原始参数(例如a b c d e f g)?

我正在使用 Centos 和 Ubuntu。

【问题讨论】:

  • 我可以使用 5.14.0 重现。它可能在 5.14.1 或 5.14.2 中未修复。应使用perlbug 命令行工具报告错误。
  • 5.22.0 还没有修复(在 Linux Mint 系统上试过)。

标签: perl ubuntu centos ps argv


【解决方案1】:

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

$0 = "perl $0 @ARGV";

【讨论】:

    【解决方案2】:

    有趣。我只是尝试了类似的方法,在调用 ps 之前显示了 $0 的值。

    这是我的脚本:

    #!/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 作为指示当前的方式更有用 程序状态而不是隐藏您正在运行的程序。

    【讨论】:

    • 我想你可以使用$0 = "$^X $0 @ARGV" 来捕获perl解释器的确切路径
    • @user5402:是的,但是如果您使用perl foo.pl 调用它,那么ps 不会显示 Perl 解释器的完整路径。
    猜你喜欢
    • 1970-01-01
    • 2019-06-13
    • 2017-07-17
    • 1970-01-01
    • 1970-01-01
    • 2011-10-06
    • 1970-01-01
    • 2019-07-23
    • 1970-01-01
    相关资源
    最近更新 更多