Umask
由給定 shell 的 umask 設置的文件創建遮罩通常是完全對作業系統唯一的還是僅對給定的 shell 唯一?
由給定 shell 設置的文件創建遮罩
umask
通常是完全對作業系統唯一的還是僅對給定 shell 唯一?例如,如果我在 Bash 中更改文件創建遮罩(umask 的遮罩/位遮罩),它是否會僅針對 Bash 或我的作業系統中可能存在的其他 shell(如 Dash、ksh、zsh 等)更改?(“一個案例是一個外殼影響其他人”)。
要了解 umask,首先需要了解 Unix/Linux 中的程序結構。也就是說,它們形成了一個樹狀結構。每個程序都需要有一個父程序,這是產生它的程序。(除了第一個過程,
init
)。每個程序可能會或可能不會產生更多程序,稱為子程序。每個程序都有一個遮罩屬性。這是使用 umask 命令查詢或設置的內容。
程序繼承其父程序的遮罩。然後他們可以更換自己的面具。例如,有一個
umask()
C 函式可以更改您正在編寫的程序的遮罩,而無需umask
從 shell 呼叫。子程序不能影響其父程序的遮罩。因此,改變一個程序的遮罩不會影響整個系統。它只會影響任何未來的子程序。
由於 shell 的目的是能夠創建和控制其他程序,
umask
因此大多數 shell 都內置了一個命令。這不是 shell 所必需的,可以編寫一個沒有umask
功能的基本 shell。但是這樣的 shell 不會被認為是用於登錄和管理系統的通用 shell。您可以使用像 Bash 這樣的 shell 可以生成其他 Bash shell(或您喜歡的任何其他 shell)的事實來測試我自己所說的內容:
- 打開終端
- 執行
umask
命令查詢目前值- 執行
bash
(或其他)以生成子外殼- 執行
umask
檢查孩子麵具的價值- 將孩子的面具設置為其他東西,例如執行
umask 0000
- 再次跑去
umask
檢查孩子的口罩- 從子 shell 退出(執行
exit
或按Ctrl-d
)- 您現在又回到了父 shell 中。執行
umask
檢查它的遮罩有用的參考資料:
man 1 umask
man 2 umask
(這給出了umask()
C 函式的參考)man bash
(並蒐索umask
)- https://en.wikipedia.org/wiki/Umask