由给定 shell 的 umask 设置的文件创建掩码通常是整个操作系统唯一的还是仅对于该给定 shell 唯一?

由给定 shell 的 umask 设置的文件创建掩码通常是整个操作系统唯一的还是仅对于该给定 shell 唯一?

是一个文件创建掩码由给定 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)的事实:

  1. 打开终端
  2. 运行umask命令查询当前值
  3. 运行bash(或其他)来生成子 shell
  4. 运行umask查看child的mask值
  5. 将孩子的面具设置为其他东西,例如跑步umask 0000
  6. 再次跑去umask检查孩子的口罩
  7. 退出子 shell(运行exit或按Ctrl-d
  8. 您现在再次回到父 shell 中。运行umask检查其掩码

有用的参考:

相关内容