Каждый из этих методов по-разному указывает на успешность, и есть также два разных типа успешности: успешно ли он выполняется, и статус завершения, возвращаемый процессом.
IPC :: System:: Simple system
сгенерирует исключение, если команда не выполнится или вернет ненулевой статус. Вы можете определить приемлемые ненулевые состояния, передавая arrayref в качестве первого аргумента. Проще всего, когда вы хотите, чтобы ошибки приводили к смерти вашей программы с полезным сообщением об ошибке, поэтому вам не нужно обрабатывать какие-либо исключения, такие как eval или try / catch.
use strict;
use warnings;
use IPC::System::Simple qw(system EXIT_ANY);
system $cmd; # failure or non-zero exit will cause program to die
my $exit = system EXIT_ANY, $cmd; # failure to execute will cause program to die
use Syntax::Keyword::Try;
try {
system $cmd;
} catch {
# error in $@
}
try {
my $exit = system [0..5], $cmd;
if ($exit) {
# one of the allowed non-zero exit status
}
} catch {
# error in $@
}
try {
my $exit = system EXIT_ANY, $cmd;
if ($exit) {
# non-zero exit status
}
} catch {
# error starting command in $@
}
IPC:: Run3 вызовет исключение в случае сбоя команды и установит $? в состояние ожидания. Его возвращаемое значение всегда истинно.
use strict;
use warnings;
use IPC::Run3;
use Syntax::Keyword::Try;
try {
run3 $cmd;
if ($?) {
# non-zero exit status
my $exit = $? >> 8;
}
} catch {
# error starting command in $@
}
qx
или обратные кавычки, являющиеся оператором readpipe , не вызовут исключение, но вернут undef, если команда не запустилась, ив противном случае установите $?
так же, как IPC :: Run3.
use strict;
use warnings;
my $output = `$cmd`;
if (!defined $output) {
# error occured starting command, check $!
} elsif ($?) {
# non-zero exit status
my $exit = $? >> 8;
}
Встроенная функция system вернет состояние ожидания или -1, если команда не запустиласьи установите то же значение в $?
.
use strict;
use warnings;
system $cmd;
if ($? == -1) {
# error occured starting command, check $!
} elsif ($?) {
# non-zero exit status
my $exit = $? >> 8;
}
Обратите внимание, что все эти параметры, кроме оператора readpipe (но см. мой IPC :: ReadpipeX ), поддерживают передачу командыв виде списка, который обходит оболочку и, таким образом, безопаснее, когда команда может содержать произвольный ввод, но иногда может содержать ошибки в Windows, так как она только притворяется, что обходит оболочку там.
system 'pmcmd.exe', 'startworkflow', '-sv', ...;
run3 ['pmcmd.exe', ...];