system 使用時にプログラムの終了を待たずに制御を返す方法

2010-12-04

こんにちは。いつまでたっても Perl が全然わからないはせがわです。

ActivePerl を使っていて外部のコマンドを system で呼び出したはいいけど、そのプログラムが終了するまで system の呼び出し以降のコードがブロックされて困ったことはありませんか?

例えば

print "abc\n";
system "notepad.exe";
print "def\n";

というコードだと、"def" が表示されるのは、起動したメモ帳が終了してからになってしまいます。
メモ帳が起動すれば終了を待たずに速やかに次のコードが実行されるほうが嬉しい場合もあります。

こういう場合は、system で直接 notepad.exe を呼び出すのではなく、いったん start コマンドを介するようにして起動します。

print "abc\n";
system "start", "notepad.exe";
print "def\n";

startコマンドはメモ帳を立ち上げると即座に終了するため、メモ帳の終了を待たずにPerlのコードに制御を戻すことができます。

同じように、環境変数 PAGER に

C:\>set PAGER=start notepad

と設定しておくと、コマンドラインから perldoc を呼び出したときにメモ帳でドキュメントを表示することができ、またメモ帳が閉じられるまでコマンドラインがブロックされるということもなくなります。

ちょっとしたTipsですが覚えておくと便利ですね。