うーん、興味深いことに、さまざまな人がこのさまざまな方法で答えています。私にはmkのように見え、Daniel Foneはそれをコマンドの stdout を表示/操作したいと解釈しました (どちらのソリューションも stderr fwiw をキャプチャしません)。ラッドが近づいたと思います。Rudd の応答に加えることができる 1 つのひねりは、組み込みの system() コマンドを独自のバージョンで上書きすることです。これにより、彼の execute() コマンドを使用するために既存のコードを書き直す必要がなくなります。
Rudd の投稿から彼の execute() サブルーチンを使用すると、コードの先頭に次のようなものを含めることができます。
if ($DEBUG) {
*{"CORE::GLOBAL::system"} = \&{"main::execute"};
}
それはうまくいくと思いますが、これはブードゥー教であり、このコードを書いてからしばらく経っていることを認めなければなりません。モジュールのロード時にローカル (呼び出し元の名前空間) またはグローバル レベルでシステム コールをインターセプトするために、私が何年も前に書いたコードを次に示します。
# importing into either the calling or global namespace _must_ be
# done from import(). Doing it elsewhere will not have desired results.
delete($opts{handle_system});
if ($do_system) {
if ($do_system eq 'local') {
*{"$callpkg\::system"} = \&{"$_package\::system"};
} else {
*{"CORE::GLOBAL::system"} = \&{"$_package\::system"};
}
}