3

引数を指定して実行すると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

つまり、3 番目のケースで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

面白い。$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$$";

出力は次のとおりです (最初$はシェル プロンプトです)。

$ ./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、notとして表示します/usr/bin/perl(後者は有用な情報になる可能性があります)。

Perl は$0元の値に復元しようとしているようですが、 で示されている情報を復元することに成功していませんps

肝心なのは、変更$0は有用であるということですが、動作は 100% 信頼できるわけでも移植できるわけでもありません。

perldoc perlvar言います:

すべてではありませんが一部のオペレーティング システムでは、$0 に代入すると、ps プログラムが認識する引数領域が変更されます。一部のプラットフォームでは、変更を確認するために特別な ps オプションまたは別の ps を使用する必要がある場合があります。$0 の変更は、実行中のプログラムを非表示にするよりも、現在のプログラムの状態を示す方法として役立ちます。

于 2011-10-12T20:09:39.423 に答える