我需要这个程序的帮助。作为我项目的一部分,我需要 创建一个目录。我正在使用系统功能来执行此操作,但是 后来被告知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
答案 0 :(得分:10)
您将权限作为 字符串 传递。 mkdir
期望它为 数字 。但是字符串中的八进制数字被解释为 十进制 。因此,'0755'
被解释为十进制755
,并由mkdir
使用。
要解决此问题,您可以调用子例程传递数字权限:
createDir('.today',0755);
或者,您可以使用oct
函数将八进制字符串转换为数字值。
子程序调用保持不变:
createDir('.today','0755');
但其定义更改为使用oct
函数:
mkdir $dir,oct($perm) or die "$!";
答案 1 :(得分:3)
mkdir
的第二个参数不是创建模式。它是一个掩码,&
与~umask
一起确定创建模式。如果您指定参数0755并且您的umask是027,那么0755 &~ 0027 == 0750
。确保将所有内容保持为八进制,不十进制。
通过use POSIX qw[ :sys_stat_h ]
可以获得这些内容的常量,例如S_IRWXU
,S_IWGRP
和S_ISVTX
,但这些常数可能比它们值得更多
答案 2 :(得分:3)
修复codeaddict的字符串与数字问题并注意tchrist的umask问题后,如果需要特定权限,则应在创建新目录后调用chmod。
我通常在没有掩码的情况下调用mkdir,然后将目录chmod到我想要的权限。
从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);
}
}