Является ли значение, возвращаемое системой() таким же, как "$?"?
Когда я выполняю вызовы system()
в Perl, я обычно проверяю код возврата в соответствии с perldocs. Ну, я так и думал. Большую часть времени $rc!=0
достаточно для меня. Недавно я помог двум людям, у которых возникли проблемы с вызовами system()
при запуске их .cgi-скриптов под apache. Я попросил их изучить $rc
of
my $rc = system(...);
и связали их с документами system()
. Затем я подошел поближе и заметил, что документы на самом деле не говорят о $rc
, а вместо этого о $?
, и я чувствовал себя немного смущенным, и возник вопрос:
Есть ли разница между:
system(...);
if ($? == -1) {
print "failed to execute: $!\n";
}
elsif ($? & 127) {
printf "child died with signal %d, %s coredump\n",
($? & 127), ($? & 128) ? 'with' : 'without';
}
else {
printf "child exited with value %d\n", $? >> 8;
}
и
my $rc = system(...);
if ($rc == -1) {
print "failed to execute: $!\n";
}
elsif ($rc & 127) {
printf "child died with signal %d, %s coredump\n",
($rc & 127), ($rc & 128) ? 'with' : 'without';
}
else {
printf "child exited with value %d\n", $rc >> 8;
}
Или, короче говоря, $rc
равно $?
для system()
?
Я просмотрел документы system, wait и $?, но мне это не совсем понятно. Я делал неправильно в течение последних 15 лет, используя $rc
?
Ответы
Ответ 1
Да, возвращаемое значение system
должно равняться $?
.
Однако, поскольку $?
относится не только к system
вызовам, а $?
- глобальная переменная, она может быть перезаписана другими действиями, которые происходят. Из perldoc -v '$?'
они включают:
$CHILD_ERROR
$?
Состояние, возвращаемое последней командой закрытия, команда backtick ( "` `" ), успешный вызов "wait()" или "waitpid()" или из оператора "system()".
Намного безопаснее хранить значение сразу, а затем сравнивать:
my $rc = system('ls myfile.txt');
if ( $rc >> 8 != 0 ) {
# do something because ls exited with an error
}