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

1 umask

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

例如,如果我在 Bash 中更改文件创建掩码(umask 的掩码/位掩码),它是否仅对 Bash 或我的操作系统中可能的其他现有 shell(如 Dash、ksh、zsh 等)发生变化?(“一个案例是一个外壳影响其他人”)。

cry*_*rch 5

要了解 umask,首先需要了解 Unix/Linux 中的进程结构。也就是说,它们形成了一个树状结构。每个进程都需要有一个父进程,它是产生它的进程。(第一个过程除外,init)。每个进程可能会也可能不会产生更多的进程,称为子进程。

每个进程都有一个掩码属性。这是使用 umask 命令查询或设置的内容。

进程继承其父进程的掩码。然后他们可以更换自己的面具。例如,有一个umask()C 函数可以更改您正在编写的程序的掩码,而无需umask从 shell调用。

子进程不能影响其父进程的掩码。因此,更改进程的掩码不会影响整个系统。它只会影响任何未来的子进程。

由于外壳程序的目的是能够创建和控制其他进程,因此umask大多数外壳程序都内置了命令。这不是 shell 所必需的,可以编写一个没有umask功能的基本 shell 。但是这样的外壳不会被认为是用于登录和管理系统的通用外壳。

你可以自己测试我所说的,使用像 Bash 这样的 shell 可以产生其他 Bash shell(或任何你喜欢的其他 shell)的事实:

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

有用的参考: