![由给定 shell 的 umask 设置的文件创建掩码通常是整个操作系统唯一的还是仅对于该给定 shell 唯一?](https://linux22.com/image/141962/%E7%94%B1%E7%BB%99%E5%AE%9A%20shell%20%E7%9A%84%20umask%20%E8%AE%BE%E7%BD%AE%E7%9A%84%E6%96%87%E4%BB%B6%E5%88%9B%E5%BB%BA%E6%8E%A9%E7%A0%81%E9%80%9A%E5%B8%B8%E6%98%AF%E6%95%B4%E4%B8%AA%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F%E5%94%AF%E4%B8%80%E7%9A%84%E8%BF%98%E6%98%AF%E4%BB%85%E5%AF%B9%E4%BA%8E%E8%AF%A5%E7%BB%99%E5%AE%9A%20shell%20%E5%94%AF%E4%B8%80%EF%BC%9F.png)
是一个文件创建掩码由给定 shell 设置的值umask
通常对于整个操作系统是唯一的,还是仅对于该给定 shell 是唯一的?
例如,如果我在 Bash 中更改文件创建掩码(umask 的掩码/位掩码),它是否只会针对 Bash 进行更改,或者还会针对操作系统中可能存在的其他 shell(如 Dash、ksh、zsh 等)进行更改? (“一个案例是一个炮弹影响其他炮弹”)。
答案1
要了解umask,首先需要了解Unix/Linux中的进程结构。也就是说,它们形成了一个树状结构。每个进程都需要有一个父进程,即生成它的进程。 (第一个过程除外init
)。每个进程可能会也可能不会产生更多进程,称为子进程。
每个进程都有一个 mask 属性。这是使用 umask 命令查询或设置的内容。
进程继承其父进程的掩码。然后他们可以更换自己的面具。例如,有一个umask()
C 函数可以更改您正在编写的程序的掩码,而无需umask
从 shell 调用。
子进程不能影响其父进程的掩码。因此,改变进程的掩码不会影响整个系统。它只会影响任何未来的子进程。
由于 shell 的用途是能够创建和控制其他进程,因此umask
大多数 shell 中都内置了命令。这对于 shell 来说不是必需的,可以编写一个没有umask
功能的基本 shell。但是这样的 shell 不会被认为是有用的用于登录和管理系统的通用 shell。
您可以自己测试我所说的内容,使用像 Bash 这样的 shell 可以生成其他 Bash shell(或您喜欢的任何其他 shell)的事实:
- 打开终端
- 运行
umask
命令查询当前值 - 运行
bash
(或其他)来生成子 shell - 运行
umask
查看child的mask值 - 将孩子的面具设置为其他东西,例如跑步
umask 0000
- 再次跑去
umask
检查孩子的口罩 - 退出子 shell(运行
exit
或按Ctrl-d
) - 您现在再次回到父 shell 中。运行
umask
检查其掩码
有用的参考:
man 1 umask
man 2 umask
(这给了C函数的参考umask()
)man bash
(并搜索umask
)- https://en.wikipedia.org/wiki/Umask