Системные команды против подпрограмм Perl
У меня есть следующий фрагмент кода, который я выполняю как часть нескольких работ каждый день:
system("cp $keyFile $destinationFile");
system("chown $userID $destinationFile");
system("chmod 400 $destinationFile");
Проблема с приведенным выше кодом состоит в том, что иногда, очень редко, по крайней мере, одна из вышеперечисленных операций не завершается успешно, и моя работа не выполняется. Несмотря на то, что это нормально для задания, если одна из перечисленных выше операций не удалась, я все же хочу избежать сбоя одной из простых системных команд.
Итак, у меня есть следующие варианты:
- Используйте подпрограммы Perl
File::Copy::copy
,chmod
,chown
вместо системных команд. - Проверьте возвращаемые значения
system()
команды. Это я сделал, но не объясняю, почему это может потерпеть неудачу.
Лучше / безопаснее использовать подпрограммы Perl вместо системных команд. Мои работы всегда будут выполняться на машине RHEL5 [никогда Windows].
Есть ли что-нибудь еще, что я могу сделать здесь. Как я могу собрать больше информации о том, что пошло не так?
Обновление: имена файлов или пути к файлам никогда не будут содержать пробелов или странных символов. Они будут из набора [a-zA-Z].
1 ответ
Да, всегда лучше использовать собственные версии Perl (File::Copy
а также chmod()
).
Среди многих причин:
Спектакль. призвание
system()
разветвляется от 1 до 2 новых процессов (один для команды и, вероятно, другой для оболочки), что является тяжелой операциейПроверка ошибок. Связанные с IO системные вызовы в Perl устанавливают
"$!"
текстовая переменная ошибки при возникновении ошибок:File::Copy::copy($source, $destination) || die "Failed to copy from $source to $destination. Error: $!\n";