面白い。$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 の変更は、実行中のプログラムを非表示にするよりも、現在のプログラムの状態を示す方法として役立ちます。