Получить код возврата и вывод из команды в Perl
Я пытаюсь написать утилиту, которая будет проходить через файл, который будет выглядеть так:
# Directory | file name | action | # of days without modification to the file for the command to take action
/work/test/|a*|delete|1
/work/test/|b*|compress|0
/work/test/|c*|compress|1
мой скрипт будет проходить через файл, решая, например, есть ли файлы под /work/test/, которые начинаются с "a", которые не были изменены в течение последних 1 дней, и если да, то он удалит их.
для этого, я использую команду find. Пример:
my $command = "find " . $values[0] . $values[1] . " -mtime +" . $values[3] . " -delete ;n";
system ($command);
но, меня попросили вернуть код возврата для каждого шага, чтобы убедиться, что каждый шаг сработал отлично.
теперь я знаю, что system () возвращает код возврата, а backticks возвращает вывод. Но как я могу получить и то, и другое?
2 ответов
после запуска backticks код возврата доступен в $?
.
$?
состояние, возвращаемое последней командой закрытия канала, backtick ( ` ), успешным вызовом wait () или waitpid () или оператором system (). Это всего лишь 16-битное слово состояния, возвращаемое традиционным системным вызовом Unix wait () (или иначе составлено так, чтобы выглядеть).
$output = `$some_command`;
print "Output of $some_command was '$output'.\n";
print "Exit code of $some_command was $?\n";
универсальным решением для backticks, system () и т. д. является использование ${^CHILD_ERROR_NATIVE}
переменной. Смотрите perldoc perlvar:
http://perldoc.perl.org/perlvar.html#%24%7b%5eCHILD_ERROR_NATIVE%7d
${CHILD_ERROR_NATIVE^} Собственный статус, возвращаемый последней командой закрытия канала, backtick ( ` ), успешным вызовом wait() или waitpid () или оператором system (). В POSIX-подобных системах это значение можно декодировать с помощью WIFEXITED, WEXITSTATUS, WIFSIGNALED, Wtermsig, WIFSTOPPED, WSTOPSIG и WIFCONTINUED функции, предоставляемые модулем POSIX.