Получить код возврата и вывод из команды в 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.