2010-10-30 3 views
4

Мне нужна помощь в этой программе. В рамках моего проекта мне нужно создать . Я использовал системную функцию для этого, но позже было сказано, что Perl имеет встроенную функцию mkdir.Как создать каталог с «правильными» разрешениями с помощью mkdir Perl?

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

Создает каталог, но разрешения разные. Здесь моя функция, которая создает каталог:

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

и я называю это во многих частях моей программы как:

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

.Сегодня каталог получает созданный, но проблема с разрешениями, он не имеет разрешения 0755.

Что я делаю неправильно?

детали Мои Perl являются:

$perl -v 

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

ответ

9

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

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

createDir('.today',0755); 

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

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

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

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

mkdir $dir,oct($perm) or die "$!"; 
+0

Это было бы более четко написано как 'mkdir ($ dir, oct ($ mask)) || die "не может mkdir $ dir: $!"; '. – tchrist

3

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

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

2

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

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

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

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

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

sub createDir { 
     my ($dir, $perm) = @_; 
     if(!-d $dir) { 
       my $old = umask(0); 
       mkdir($dir, $perm) or die "$!"; 
       umask($old); 
     } 
     else { 
       chmod($dir, $perm); 
     } 
} 
+0

+1 Это мое самое полное решение. Чтобы сделать это, просто «chmod». – Axeman

Смежные вопросы