Хм, интересно, как разные люди отвечают на это по-разному. Мне кажется, что mk и Daniel Fone интерпретировали его как желание видеть / манипулировать stdout команды (ни одно из их решений не захватывает stderr fwiw). Я думаю Радд стал ближе. Единственный поворот, который вы могли бы предпринять в ответе Радда, - переписать встроенную команду system () своей версией, чтобы вам не пришлось переписывать существующий код для использования его команды execute ().
используя его подпрограмму 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"};
}
}