Является ли значение, возвращаемое системой() таким же, как "$?"?

Когда я выполняю вызовы 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
}