5

我需要这个程序的帮助。作为我项目的一部分,我需要创建一个目录。我正在使用系统函数来执行此操作,但后来被告知 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

这是为 x86_64-linux-thread-multi 构建的 perl v5.8.8
4

3 回答 3

10

您将权限作为字符串传递。mkdir期望它是numeric。但是字符串中的八进制数被解释为十进制。所以'0755'被解释为十进制755并被mkdir.

要解决此问题,您可以调用传递数字权限的子例程:

createDir('.today',0755);

或者,您可以使用 makeoct函数将八进制字符串转换为数值。

子程序调用保持不变:

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

但其定义更改为将oct函数用作:

mkdir $dir,oct($perm) or die "$!";
于 2010-10-30T06:34:07.127 回答
3

修复 codeaddict 的字符串与数字问题并注意 tchrist 的 umask 问题后,如果需要特定权限,则应在创建新目录后在新目录上调用 chmod。

我通常调用不带掩码的 mkdir,然后将目录 chmod 为我想要的权限。

从外壳检查这些:

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

您还可以在调用 mkdir 之前将 umask 设置为零,如果您需要以原子方式创建具有正确权限的目录,则需要这样做。像这样的东西可能是你正在寻找的东西:

sub createDir {
        my ($dir, $perm) = @_;
        if(!-d $dir) {
                my $old = umask(0);
                mkdir($dir, $perm) or die "$!";
                umask($old);
        }
        else {
                chmod($dir, $perm);
        }
}
于 2010-10-30T16:04:01.513 回答
3

to的第二个参数mkdir不是创建模式。它是一个掩码,&用于~umask确定创建模式。如果您指定参数 0755 并且您的 umask 是 027,则0755 &~ 0027 == 0750. 确保将所有内容保留为八进制,而不是十进制。

也可以通过use POSIX qw[ :sys_stat_h ]、和获得这些东西的常量S_IRWXU,但这些可能比它们的价值更麻烦。S_IWGRPS_ISVTX

于 2010-10-30T07:47:21.250 回答