2014-10-19 53 views
1

我正在嘗試寫入現有文件並同時更改其權限。例如:寫入現有文件並更改權限

use warnings; 
use strict; 
use File::Slurp 'write_file'; 

my $script="#! /bin/bash 
echo \"Hello\" 
"; 

my $saveName='test.sh'; 
unlink $saveName if -f $saveName; 
writeFile($saveName,$script,0755); 
writeFile($saveName,$script,0775); 


sub writeFile { 
    my ($saveName,$script,$mode) = @_; 

    printf "Writing file with permissions %04o\n", $mode & 07777; 
    write_file($saveName,{perms=>$mode},\$script); 
    my $actualMode = (stat($saveName))[2]; 
    printf "Actual file permissions are %04o\n", $actualMode & 07777; 
} 

這使輸出:

Writing file with permissions 0755 
Actual file permissions are 0755 
Writing file with permissions 0775 
Actual file permissions are 0755 

爲什麼是第二寫操作之後的許可仍然0755? (我會想到它是0775

回答

2

the documentation

perms 

The perms option sets the permissions of newly-created files. This value is 
modified by your process's umask and defaults to 0666 (same as sysopen). 

注 「新建」 這個詞。

此行爲並非由模塊決定,而是由核心sysopen決定。從File::Slurp來源:

   my $perms = $opts->{perms} ; 
       $perms = 0666 unless defined $perms ; 

#printf "WR: BINARY %x MODE %x\n", O_BINARY, $mode ; 

# open the file and handle any error. 

       $write_fh = local(*FH) ; 
#    $write_fh = gensym ; 
       unless (sysopen($write_fh, $file_name, $mode, $perms)) { 

我們看到sysopen使用。在the documentation for sysopen它說:

如果由filename 命名的文件不存在,並公開徵集創建它(通常是因爲MODE包括O_CREAT標誌),然後燙髮值指定新創建的權限文件。

+0

謝謝,但這對我來說似乎是一種奇怪的方法。這意味着如果你想使用'perms'選項來'write_file',你首先必須檢查文件是否已經存在。如果是這樣的話,你必須明確地刪除它,或者在你編寫文件後使用'chmod' .. – 2014-10-19 08:46:55

+1

這不是由模塊控制,而是由'sysopen'控制。我將添加文檔以向您展示。 – TLP 2014-10-19 09:05:08