У меня есть сценарий Perl, который называет другой сценарий. Сценарий Perl должен распространять код возврата сценария, но, кажется, возвращает нуль своей вызывающей стороне (JAVA-приложение) desipte явный вызов к exit $scriptReturnCode
.
Код и вывод следующим образом (я понимаю это <=>
мог быть !=
но это - то, что я имею):
print "INFO: Calling ${scriptDirectory}/${script} ${args}"
$scriptReturnCode = system("${scriptDirectory}/${script} ${args}");
if ( $scriptReturnCode <=> 0 ) {
print "ERROR: The script returned $scriptReturnCode\n";
exit $scriptReturnCode;
} else {
print "INFO: The script returned $scriptReturnCode.\n";
exit 0;
}
Вывод, который я имею от своего Java:
20/04/2010 14:40:01 - INFO: Calling /path/to/script/script.ksh arg1 arg2
20/04/2010 14:40:01 - Could not find installer files <= this is from the script.ksh
20/04/2010 14:40:01 - ERROR: The script returned 256
20/04/2010 14:40:01 - Command Finished. Exit Code: 0 <= this is the Java app.
Вам необходимо сместить код возврата с system ()
вызовом на 8 бит.
Например. $ exit_value = $? >> 8;
# В вашем скрипте $? is $ scriptReturnCode
From http://perldoc.perl.org/perlfaq8.html :
system ()
запускает команду и возвращает информацию о статусе выхода (как 16-битное значение : младшие 7 бит - это сигнал, из-за которого процесс умер, если таковой имеется, а старшие 8 бит - это фактическое значение выхода
Более расширенная проверка кода на наличие coredump может выглядеть так:
system();
if ($? == -1) {
print "failed to execute: $!\n";
} elsif ($? & 127) {
printf "child died - signal %d, %s coredump\n",
($? & 127), ($? & 128) ? 'with' : 'without';
} else {
printf "child exited with value %d\n", $? >> 8;
}
ОБНОВЛЕНИЕ: Согласно Отличное напоминание ysth, коды выхода усекаются до 8 (младших) битов, поэтому возвращение 256 вместо предполагаемой 1 заканчивается как 0. Аналогично, возвращение 257 заканчивается как 1.
Если захват $?
и изменение его значения слишком сложно запомнить, вы можете упростить этот код, используя IPC :: System :: Простой , который расширяет system ()
и обратные кавычки за счет дополнительной проверки ошибок и диагностики, например:
use IPC::System::Simple qw(run EXIT_ANY);
my $command = "${scriptDirectory}/${script} ${args}";
print "INFO: Calling $command\n";
# runs command through a shell first; does not die on any exit value
run(EXIT_ANY, $command);
my $scriptReturnCode = $IPC::System::Simple::EXITVAL;