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

Мне нужна помощь с этой программой.В рамках моего проекта мне нужно создать каталог.Для этого я использовал системную функцию, но позже мне сказали, что в Perl есть встроенная команда с именем mkdir .

Я нахожусь на Ubuntu 10.04.Проблема в mkdir, похоже, не работает по мере необходимости.

Создает каталог, но разрешения различаются.Вот моя функция, которая создает каталог:

sub createDir {
       my ($dir,$perm) = @_;
       unless(-d $dir) {
               mkdir $dir,$perm or die "$!";
       }
}

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

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

каталог .today создается, но проблема заключается вразрешения, у него нет разрешения 0755.

Что я делаю не так?

Мои данные Perl:

$perl -v

This is perl, v5.8.8 built for x86_64-linux-thread-multi

Ответы [ 3 ]

10 голосов
/ 30 октября 2010

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

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

createDir('.today',0755);

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

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

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

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

mkdir $dir,oct($perm) or die "$!";
3 голосов
/ 30 октября 2010

После того, как вы исправите проблему строки кода в зависимости от числа и отметите проблему 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);
        }
}
3 голосов
/ 30 октября 2010

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

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

...