Как мне избежать печати в STDOUT при использовании Perl `IPC :: System :: Simple: runx`?

Я использую _1 _ для выполнения системных команд и смерти при неожиданных возвращаемых значениях. Проблема в том, что вывод команд выводится в оболочку.

  1. Как я могу избежать печати этого вывода?
  2. Как я могу не печатать этот вывод, а помещать его в переменную perl?

ОБНОВЛЕНИЕ

3) Как я могу распечатать этот вывод, если выполнение не удается?


person David B    schedule 17.09.2010    source источник


Ответы (2)


захват ( ) команда? Или capturex ().

Цитируется по ссылке:

Обработка исключений

В случае, когда команда возвращает неожиданный статус, и запуск, и захват вызовут исключение, которое, если не будет обнаружено, завершит вашу программу с ошибкой.

Захватить исключение просто:

eval {
    run("cat *.txt");
};

if ($@) {
    print "Something went wrong - $@\n";
}

См. Раздел диагностики ниже для получения более подробной информации.

person colithium    schedule 17.09.2010
comment
Спасибо, но capture идентичен runx в части стадии выполнения (socu говорит, что catpure работает как обратные кавычки, а run работает как system)? Могу ли я распечатать то, что было снято, только в случае неудачи? - person David B; 17.09.2010
comment
Спасибо. По-видимому, capturex по умолчанию делает именно то, что я хочу: если все идет нормально, он молчит, если возникает ошибка (например, неожиданное возвращаемое значение и т. Д.), Он умирает, но сначала печатает вывод команды вместе со своим собственным сообщением. Здорово! - person David B; 17.09.2010

Если модуль ведет себя очень неприятно и печатает прямо в STDOUT, вы всегда можете перенаправить STDOUT на что-то другое. Это своего рода взлом, но для некоторых модулей он требуется.

# Save STDOUT for restore later
open(OLD_STDOUT, ">>&STDOUT");
open(STDOUT, ">/some/file/or/dev/null");
# call your module
# Restore STDOUT
open(STDOUT, ">>&OLD_STDOUT");
person tex    schedule 17.09.2010