Почему аргумент os.umask() инвертирован? (umask 0o000 делает chmod 0o777)

В большинстве случаев разрешения определяются как восьмеричное число в формате 0777. Но для команды UNIX umask (таким образом, os.umask()) требуется 0o000, чтобы получить разрешающие биты 0o777 и 0o022 равными 0o755 в моем понимании.

Я слышал, что UNIX umask по какой-то причине инвертируется, и я не понимаю причину этого. Может ли кто-нибудь объяснить это несоответствие?

Ответ 1

Нет реальной несогласованности, так как связь между umask и chmod может быть записана чисто с помощью уравнений. По-видимому, umask устанавливает противоположность chmod, он был создан так же в прежние времена.

Пример: 022 (обычный umask) создает 755. Он работает следующим образом:

  • 7 - 0 = 7 становится первым байтом
  • 7 - 2 = 5 становится вторым и третьим байтами

Используя этот пример, umask 777 создает файл с chmod 000, umask 112 будет равен chmod 664. Насколько мне известно, это произошло потому, что изначально была создана команда umask, чтобы указать, какие биты разрешения будут иметь файл NOT после его создания (отсюда и инверсия).

В то время как это может раздражать, ему действительно не сложно привыкнуть. Подумайте, как бы вы chmod ваши файлы и вычитали байт из 7, и вы получите значение umask. Или, когда вы находитесь в среде IDE, написав свой код, не используйте umask, а скорее создайте файл (с по умолчанию umask, конечно), а затем используйте вместо этого в Python os.chmod().