Как я могу создать каталог с «правильными» разрешениями, используя Perl mkdir?


person user491976    schedule 30.10.2010    source источник


Ответы (3)


Вы передаете разрешение в виде строки. mkdir ожидает, что оно будет числовым. Но восьмеричное число внутри строки интерпретируется как десятичное. Итак, '0755' интерпретируется как десятичное 755 и используется mkdir.

Чтобы исправить это, вы можете вызвать подпрограмму, передав ей числовое разрешение:

createDir('.today',0755);

В качестве альтернативы вы можете использовать функцию oct для преобразования восьмеричной строки в числовое значение.

Вызов подпрограммы остается прежним:

createDir('.today','0755');

но его определение изменяется, чтобы использовать функцию oct как:

mkdir $dir,oct($perm) or die "$!";
person codaddict    schedule 30.10.2010
comment
Это было бы более четко записано как mkdir($dir, oct($mask)) || die "cannot mkdir $dir: $!";. - person tchrist; 30.10.2010

После того, как вы исправите проблему строки codeaddict с числом и обратите внимание на проблему umask tchrist, вы должны вызвать chmod в новом каталоге после его создания, если вам нужны определенные разрешения.

Я обычно вызываю mkdir без маски, а затем chmod каталог с разрешениями, которые я хочу.

Проверьте это из оболочки:

$ perldoc -f mkdir
$ perldoc -f chmod
$ perldoc -f unmask

Вы также можете установить umask равным нулю перед вызовом mkdir, вам нужно будет сделать это таким образом, если вам нужно создать каталог с правильными разрешениями атомарно. Что-то вроде этого, вероятно, то, что вы ищете:

sub createDir {
        my ($dir, $perm) = @_;
        if(!-d $dir) {
                my $old = umask(0);
                mkdir($dir, $perm) or die "$!";
                umask($old);
        }
        else {
                chmod($dir, $perm);
        }
}
person mu is too short    schedule 30.10.2010
comment
+1 Это и мое самое полное решение. Чтобы это сделать, просто chmod это. - person Axeman; 30.10.2010

Второй аргумент mkdir не является режимом создания. Это маска, которая будет & дополнена ~umask для определения режима создания. Если вы укажете аргумент 0755 и ваш umask равен 027, то 0755 &~ 0027 == 0750. Убедитесь, что все указано в восьмеричном, не десятичном формате.

Есть также константы для этих вещей, доступные через use POSIX qw[ :sys_stat_h ], такие как S_IRWXU, S_IWGRP и S_ISVTX, но они могут доставить больше проблем, чем пользы.

person tchrist    schedule 30.10.2010