2010-09-17 1 views
2

Я использую IPC::System::Simple:runx для выполнения системных команд и смерти при неожиданных возвращаемых значениях. Проблема в том, что вывод команд печатается в оболочку.Как избежать печати в STDOUT при использовании Perl `IPC :: System :: Simple: runx`?

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

UPDATE

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

ответ

2

capture() команда? Или capturex().

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

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

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

Захватив исключение легко: для более подробной информации

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

if ([email protected]) { 
    print "Something went wrong - [email protected]\n"; 
} 

Смотрите раздел диагностики ниже.

+0

Спасибо, но 'capture' идентична' runx', насколько для стадии исполнения (socu говорит, что 'catpure' работает как обратные кавычки, в то время как' run' работает как 'system')? Могу ли я печатать то, что было записано только после сбоя? –

+0

См. Редактирование, которое я только что сделал. – colithium

+0

Спасибо. По-видимому, 'capturex' делает по умолчанию именно то, что я хочу: если все идет хорошо, оно тихо, если происходит ошибка (то есть неожиданное возвращаемое значение и т. Д.), Она умирает, но сначала печатает вывод команды вместе со своим собственным сообщением. Большой! –

0

Если модуль действительно ведет себя очень неприятно и печатает непосредственно в 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");