отображение оригинальных аргументов после локализации $ 0 - PullRequest
3 голосов
/ 12 октября 2011

При запуске с аргументами 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 ]

1 голос
/ 12 октября 2011

поместите следующее в начало вашей программы:

$0 = "perl $0 @ARGV";
0 голосов
/ 13 октября 2011

Интересно.Я только что попробовал нечто подобное, показывая значение $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

Таким образом, $0 восстанавливается до исходного значения, но информация, выводимая ps, отличается.

Обратите внимание, что обходной путь @ EricStrom не совсемиметь (предположительно) предполагаемый результат;ps показывает имя команды как perl, а не /usr/bin/perl (последняя может быть полезной информацией).

Похоже, что Perl пытается восстановить $0 до исходного значения, новосстановление информации, показанной ps.

, не вполне удается. Суть в том, что изменение $0 может быть полезным, но поведение не на 100% надежно и не переносимо.

perldoc perlvar говорит:

В некоторых (но не во всех) операционных системах назначение $ 0 изменяет область аргумента, которую видит программа ps.На некоторых платформах вам, возможно, придется использовать специальные опции ps или другие ps, чтобы увидеть изменения.Изменение $ 0 более полезно для указания текущего состояния программы, чем для скрытия запущенной программы.

...