由给定 shell 设置的文件创建掩码umask
通常是完全对操作系统唯一的还是仅对给定 shell 唯一?
例如,如果我在 Bash 中更改文件创建掩码(umask 的掩码/位掩码),它是否会仅针对 Bash 或我的操作系统中可能存在的其他 shell(如 Dash、ksh、zsh 等)更改?(“一个案例是一个外壳影响其他人”)。
由给定 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
检查孩子的口罩exit
或按Ctrl-d
)umask
检查它的掩码有用的参考资料:
man 1 umask
man 2 umask
(这给出了umask()
C 函数的参考)man bash
(并搜索umask
)