Spec-Zone.ru › Perl 5.36

filetest

СОДЕРЖАНИЕ

  • НАЗВАНИЕ
  • СИНТАКСИС
  • ОПИСАНИЕ
    • Внимательно рассмотрите это
    • Под-псевдоним "access"
    • Ограничения по отношению к _

НАЗВАНИЕ

filetest - Perl-псевдоним для управления операторами проверки файлов

СИНТАКСИС

$can_perhaps_read = -r "file";      # use the mode bits
{
    use filetest 'access';          # intuit harder
    $can_really_read = -r "file";
}
$can_perhaps_read = -r "file";      # use the mode bits again

ОПИСАНИЕ

Этот псевдоним сообщает компилятору изменить поведение операторов проверки файлов, -r -w -x -R -W -X (см. perlfunc).

По умолчанию операторы проверки файлов используют простые биты режима, возвращаемые семейством системных вызовов stat(). Однако многие операционные системы имеют дополнительные возможности для определения более сложных прав доступа, например, ACL (списки управления доступом). Для таких сред use filetest может помочь операторам проверки файлов возвращать результаты, более согласующиеся с другими инструментами.

Операторы use filetest или no filetest влияют на проверки файлов, определенные в блоке, до конца ближайшего заключительного блока (они имеют лексическую область действия блока).

В настоящее время реализован только под-псевдоним access. Он включает (или отключает) использование access(), когда доступно, то есть, в большинстве UNIX-систем и других POSIX-средах. См. подробности ниже.

Внимательно рассмотрите это

Биты режима stat() вероятно, правильны для большинства файлов и каталогов, найденных в вашей системе, потому что мало кто хочет использовать дополнительные функции, предлагаемые access(). Но вы можете столкнуться с неожиданностями, если ваша программа работает на системе, использующей ACL, поскольку информация stat() не будет отражать фактические права.

Использование псевдонима filetest может немного снизить производительность операций проверки файлов, поскольку проверка битов очень быстрая.

Также обратите внимание, что использование проверок файлов в целях безопасности бесполезно с самого начала: существует открытое окно для гонок (кто может сказать, что права не изменятся между проверкой и реальной операцией?). Поэтому, если вы серьезно относитесь к безопасности, просто попробуйте реальную операцию и проверьте ее успех — думайте в терминах атомарных операций. Проверки файлов полезнее для административных задач файловой системы, когда вам не нужна информация об элементах на диске.

Под-псевдоним "access"

UNIX и POSIX-системы предоставляют абстрактный системный вызов access(), который должен использоваться для запроса прав чтения, записи и выполнения. Эта функция скрывает различные подходы к дополнительным функциям безопасности операционной системы, таким как списки управления доступом (ACL).

Расширенная функциональность проверки файлов используется Perl только в том случае, когда аргументом операторов является имя файла, а не дескриптор файла.

Ограничения по отношению к _

Поскольку access() не вызывает stat() (по крайней мере, не так, как это видно Perl), кеш результатов stat "_" не устанавливается. Это означает, что результат следующих двух проверок отличается. В первом случае биты stat /etc/passwd содержат _, а во втором случае он всё ещё содержит биты /etc.

{ -d '/etc';
  -w '/etc/passwd';
  print -f _ ? 'Yes' : 'No';   # Yes
}

{ use filetest 'access';
  -d '/etc';
  -w '/etc/passwd';
  print -f _ ? 'Yes' : 'No';   # No
}

Конечно, если ваша ОС не реализует access(), в этом случае псевдоним просто игнорируется. Лучше всего вообще не использовать _ в файле, где активен псевдоним filetest!

В качестве побочного эффекта, так как _ не работает, также не будут работать составные операторы проверки файлов (-f -w $file).

Это ограничение может быть удалено в будущих версиях Perl.

© 1993–2021 Larry Wall and others
Licensed under the GNU General Public License version 1 or later, or the Artistic License.
The Perl logo is a trademark of the Perl Foundation.
https://perldoc.perl.org/5.36.0/filetest

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API