什麼是屏蔽模式?
我知道在 GNU/Linux 中,文件權限也稱為文件模式,並且術語遮罩至少可以表示以下不同的含義:
- umask shell 內置(通常的含義)。
- umask shell 內置的相應系統呼叫。
- umask shell 內置的相應命令
umask
。- shell 程序值也稱為文件創建遮罩,以及位遮罩或只是遮罩。
- 特定於使用者的文件創建遮罩影響該使用者獨有的程序(然後稱為使用者遮罩→ 使用者的文件創建遮罩)。
umask shell內置
可以通過執行帶有適當參數的命令來使用內置的umask shell : 通過這樣做,我們為目前shell 程序樹設置遮罩; 要麼針對目前 shell 程序樹中的所有使用者,要麼只針對我們自己的使用者; 然而,一般來說,任何此類更改都將被繼承到新程序,可能是另一個 shell)。
umask
數理邏輯基礎
我知道數學邏輯包括連接AKA anding (
∧
) 的操作,這是內置umask shell 的基礎。因此:一組操作數的 and 為真,當且僅當,它的所有操作數都為真
我進一步了解,有一個基於該邏輯的同名按位運算。Anding 與數字相加 (
x + y → z
) 或字元串串聯 (x alongside y → xy
) 不同。我的問題
我知道人們可以通過這種方式“屏蔽模式”:
OCTAL BINARY HUMAN-READABLE 0666 0110110110 -rw-rw-rw- ∧ 0555 0101101101 -r-xr-xr-x 0444 0100100100 -r--r--r--
但我不確定這是否正確。
我的問題
什麼是屏蔽模式(以及為什麼
0666 ∧ 0555 → 0444
)?
umask
,shell 命令和umask
函式,都設置文件創建遮罩,也稱為umask
.您已將其改寫為
A
umask
表示 shell 內置命令和 shell 函式,該命令基於該命令並包含通常稱為文件創建遮罩的變數,其值稱為位遮罩或僅遮罩。這在許多方面是不正確的:
- 該
umask
函式不是 shell 函式;見上面的連結;- 該函式不包含變數;它設置目前程序的文件創建遮罩;
- 作用的值不只是通常稱為“文件創建遮罩”,它是文件創建遮罩(其值不稱為“位遮罩”或“遮罩”)。
遮罩會影響目前程序樹中的某些實用程序,包括可以更改的其他 shell(因此 shell Y 不一定具有 shell X 的遮罩)。
面具一般不會影響任何事情。文件創建遮罩影響目前程序,並被所有新創建的子程序繼承。子程序可以自由地再次自行更改。
此文件創建遮罩作用於新創建文件的權限。文件權限,也稱為文件模式,是一組十二位編碼文件的所有者、組和其他使用者的訪問權限;有關詳細資訊,請參閱此規範答案。它們通常表示為四位或三位八進制值。它們不是比特流。
新創建文件的權限要麼由正在創建給定文件的程序指定,要麼由預設指定(即由它們用於創建文件的函式指定)。前者的範例包括使用
open
orcreat
或來創建文件(或目錄)的程序mkdir
,這些程序必須明確指定他們想要的模式。後者的範例包括使用fopen
, 文件以預設 0666 模式結束的程序。目前umask
值屏蔽此模式。您將其改寫為
這在許多方面是不正確的:
- 在創建文件之前將遮罩應用於請求的模式,而不是之後;
mkdir
(這裡是一個函式,不是一個實用程序,但同樣適用於同名的實用程序)當然不會忽略文件創建遮罩。
umask
考慮到時,結果模式是將 umask 作為位遮罩應用於請求模式的結果:在請求模式中設置的每個位都與 中的相應位進行檢查,umask
並且僅在後者未設置時才保留。在二進制運算方面,請求的模式是與umask
. 因此umask
0022 的 a 與 0666 的模式導致 0644;不是通過減法,而是因為 0666 和 0755(0022 的補碼)是 0644。同樣,umask
0011 的 a 和 0666 的模式會導致 0666。讓我們更詳細地看一下計算。它通常表示為減法,包括在您連結到的答案中,但重要的是要了解它不是;
umask
用作遮罩。因此應用 0022 的值:Octal Binary Mode 0666 000110110110 Mask 0022 000000010010 Bits set here mask bits above Result 0644 000110100100 Octal Binary Mode 0644 000110100100 Mask 0022 000000010010 Result 0644 000110100100
這通常是通過將模式與遮罩的補碼進行按位與運算來計算的:
Octal Binary Mask 0022 000000010010 Compl. 7755 111111101101 Mode 0666 000110110110 Result 0644 000110100100
chmod
應用在其命令行上指定的模式而不考慮umask
。其他工具也這樣做,即使在創建文件時也是如此;因此cp
和tar
,當被指示保留權限時,將複製權限或恢復權限而不考慮umask
。這個答案更詳細。
你最後的問題是
我的理解夠準確嗎?0666 ∧ 0555 → 0444 怎麼來的?
第一個的答案顯然不是。第二個的答案是因為這就是按位和工作的方式。用二進制重寫操作數:
Octal Binary 0666 000110110110 0555 000101101101
現在對每個位位置執行按位和。這意味著獲取每個垂直對齊的位對,以及它們(在上面的範例中,0 ∧ 0 三次,然後 1 ∧ 1、1 ∧ 0、0 ∧ 1、1 ∧ 1 等):
000100100100
(0 ∧ 0 為 0,0 ∧ 1 為 0,1 ∧ 0 為 0,1 ∧ 1 為 1)。將上面的內容轉換回八進制,最終得到 0444。