Системные команды против подпрограмм Perl

У меня есть следующий фрагмент кода, который я выполняю как часть нескольких работ каждый день:

  system("cp $keyFile  $destinationFile");
  system("chown $userID $destinationFile");
  system("chmod 400 $destinationFile");

Проблема с приведенным выше кодом состоит в том, что иногда, очень редко, по крайней мере, одна из вышеперечисленных операций не завершается успешно, и моя работа не выполняется. Несмотря на то, что это нормально для задания, если одна из перечисленных выше операций не удалась, я все же хочу избежать сбоя одной из простых системных команд.

Итак, у меня есть следующие варианты:

  1. Используйте подпрограммы Perl File::Copy::copy, chmod, chown вместо системных команд.
  2. Проверьте возвращаемые значения 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";
    
Другие вопросы по тегам