2010-10-30 124 views
4

我需要此計劃的幫助。作爲我的項目的一部分,我需要 創建一個目錄。我使用系統功能來做到這一點,但後來被告知Perl有一個名爲mkdir的內建函數。如何使用Perl的mkdir創建具有「正確」權限的目錄?

我在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預計它是數字。但是一個字符串中的八進制數被解釋爲十進制。所以'0755'被解釋爲十進制755,正在被mkdir使用。

爲了解決這個問題,你可以調用子程序傳遞數字權限:

createDir('.today',0755); 

您也可以使用利用oct功能的八進制字符串轉換成數值。

子程序調用仍然是相同的:

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

,但其定義更改使用oct功能:

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

會更清楚地寫爲'的mkdir($目錄,華僑城($面罩))||死 「不能MKDIR $ DIR:$!」;'。 – tchrist 2010-10-30 15:57:57

3

的第二個參數mkdir不是創建模式。這是一個面具,將&編爲~umask來確定創建模式。如果您指定參數0755並且您的umask是027,那麼0755 &~ 0027 == 0750。請務必保留一切爲八進制,而不是十進制。

還有用於通過use POSIX qw[ :sys_stat_h ]提供這些東西的常量,比如S_IRWXUS_IWGRP,並S_ISVTX,但這些可能是更多的麻煩比他們的價值。

2

在修復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); 
     } 
} 
+0

+1這是我最完整的解決方案了。爲了完成它,只是'chmod'它。 – Axeman 2010-10-30 17:22:50

相關問題