使用Perl的mkdir如何创建一个具有“正确”权限的目录?

5
我需要帮助处理这个程序。作为我的项目的一部分,我需要创建一个目录。起初我使用系统函数来实现,但后来被告知 Perl 有一个叫做 mkdir 的内置函数。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
这是perl,v5.8.8,构建于x86_64-linux-thread-multi
3个回答

10

您正在将权限作为字符串进行传递。mkdir期望它是数字。但是,字符串中的八进制数字会被解释为十进制。因此,'0755' 被解释为十进制的 755 并被 mkdir 使用。

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

createDir('.today',0755);

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

子程序调用仍然相同:

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

但它的定义更改为使用 oct 函数:

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

这段代码更清晰易懂的写法是 mkdir($dir, oct($mask)) || die "cannot mkdir $dir: $!"; - tchrist

3

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

我通常会调用mkdir而不使用掩码,然后将目录的权限更改为我想要的权限。

从shell检查这些内容:

$ 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);
        }
}

+1 这也是我最完善的解决方案。只需执行 chmod 即可完成它。 - Axeman

3
mkdir的第二个参数不是创建模式,而是掩码,它将与~umask进行&运算以确定创建模式。如果您指定0755作为参数,并且您的umask为027,则0755 &~ 0027 == 0750。请确保所有内容都使用八进制表示,而不是十进制。
这些东西也可以通过use POSIX qw[ :sys_stat_h ]获得常量,例如S_IRWXUS_IWGRPS_ISVTX,但那可能会带来更多麻烦。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接