目錄

名稱

filetest - Perl pragma 用於控制檔案測試權限運算子

語法

$can_perhaps_read = -r "file";	# use the mode bits
{
    use filetest 'access';		# intuit harder
    $can_really_read = -r "file";
}
$can_perhaps_read = -r "file";	# use the mode bits again

說明

此 pragma 告訴編譯器變更檔案測試權限運算子的行為,-r -w -x -R -W -X(請參閱 perlfunc)。

檔案測試運算子的預設行為是使用 stat() 系統呼叫所傳回的簡單模式位元。但是,許多作業系統有其他功能來定義更複雜的存取權限,例如 ACL(存取控制清單)。對於此類環境,use filetest 可能有助於權限運算子傳回與其他工具更一致的結果。

use filetestno filetest 陳述會影響其區塊中定義的檔案測試,直到最近的封閉區塊結束(它們是詞彙區塊範圍)。

目前,僅實作 access 子 pragma。它會在可用的時候啟用(或停用)access(),也就是在大部分 UNIX 系統和其他 POSIX 環境中。請參閱以下詳細資料。

仔細考慮

stat() 模式位元可能適用於系統中找到的大部分檔案和目錄,因為很少人想要使用 access() 提供的其他功能。但是,如果程式在使用 ACL 的系統上執行,您可能會遇到意外情況,因為 stat() 資訊不會反映實際的權限。

當 filetest pragma 生效時,檔案測試作業可能會稍微降低效能,因為檢查位元非常便宜。

此外,請注意,從一開始就使用檔案測試來確保安全性是一件徒勞無功的事:競爭條件已開啟一個視窗(誰能保證在測試和實際操作之間權限不會改變?)。因此,如果您認真看待安全性,請嘗試實際操作並測試其是否成功 - 思考原子操作。當您不需要磁碟上元素的內容時,檔案測試更適用於檔案系統管理任務。

「access」子實用程式

UNIX 和 POSIX 系統提供抽象的 access() 作業系統呼叫,應使用該呼叫查詢讀取、寫入和執行權限。此函數隱藏了其他作業系統特定安全功能中的各種不同方法,例如存取控制清單 (ACL)

只有當運算子的引數是檔案名稱(而非檔案控制代碼)時,Perl 才會使用延伸的檔案測試功能。

關於 _ 的限制

由於 access() 沒有呼叫 stat()(至少在 Perl 中不可見),因此不會設定 stat 結果快取「_」。這表示下列兩個測試的結果不同。第一個在 _ 中有 /etc/passwd 的 stat 位元,而在第二個案例中,這仍然包含 /etc 的位元。

{ -d '/etc';
  -w '/etc/passwd';
  print -f _ ? 'Yes' : 'No';   # Yes
}

{ use filetest 'access';
  -d '/etc';
  -w '/etc/passwd';
  print -f _ ? 'Yes' : 'No';   # No
}

當然,除非您的作業系統沒有實作 access(),否則實用程式將會被忽略。最好在檔案測試實用程式處於活動狀態的檔案中完全不使用 _

由於 _ 不起作用,因此堆疊的檔案測試運算子(-f -w $file)也不會起作用。

此限制可能會在未來的 perl 版本中移除。