Вот что-то, чего я не понимаю. Допустим, в Perl у меня есть файл (дескриптор) $file
, затем
my $mode = (stat $file)[2];
дает режим файла, описанного как тип и права доступа. Затем в документах для chmod рекомендуется маскировать тип файла при отправке режима с stat на chmod , например,
my $perm = (stat $file)[2] & 07777;
chmod($perm | 0600, $file);
Точно так же документы для mkdir указывают, что mkdir(FILENAME,MASK)
"создает каталог, заданный FILENAME
, с разрешениями, указанными MASK
(изменено umask)."
Alrighty. Вот что я не понимаю. В командной строке я создаю dir temp в своем домашнем каталоге с правами по умолчанию drwxr-xr-x (восьмеричное 0755). Тогда
- Статистика perl говорит мне, что режим этого каталога - 16877.
$perms = (stat 'temp')[2] & 07777;
возвращает 493.
$perms = sprintf("%04o",(stat 'temp')[2] & 07777);
возвращает 0755.
Я ожидал, что chmod(x,'temp')
с x = (1) и (2) изменит разрешения на temp/
на что-то странное. Но все три дают drwxr-xr-x
(по общему признанию с (3) вы должны сделать chmod(oct($perms),'temp);
) Точно так же, mkdir(temp,16877)
, mkdir(temp,493)
, mkdir(temp,0755)
все дают разрешения drwxr-xr-x
на temp/
.
Итак, мой вопрос: что на самом деле происходит? Как получается, что chmod и mkdir принимают эти три разных значения и устанавливают одинаковые разрешения для temp/
? Я понимаю, что один ответ может быть «есть несколько способов сделать это», и это нормально, насколько это возможно, но я хотел бы понять, что здесь происходит. Кроме того, каков рекомендуемый способ передачи значений разрешений этим функциям? Спасибо!