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