Каждый из этих методов имеет разные способы индикации успеха, и есть также два разных типа успеха: успешное выполнение и статус выхода, возвращаемый процессом.
IPC :: System :: Simple system
выдаст исключение, если команда завершится неудачно. или возвращает ненулевой статус. Вы можете определить приемлемые ненулевые статусы, передав ссылку на массив в качестве первого аргумента. Проще всего, когда вы хотите, чтобы ошибки приводили к смерти вашей программы с помощью полезного сообщения об ошибке, поэтому вам не нужна обработка исключений, такая как 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', ...];
16.10.2019