2012-07-02 5 views
11

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

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

+2

Это «маска» - это то, что слово означает в этом контексте; то, что позволяет пропускать только незавершенные биты (подумайте о масках, используемых для рисования, чиппинга и т. п.). Если бы он не работал таким образом, это называлось бы чем-то другим. –

ответ

11

Нет никакой реальной несогласованности, так как связь между 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().

+0

«Насколько я знаю, это произошло потому, что команда umask была изначально создана, чтобы указать, какие биты разрешения у файла НЕ будут после создания (отсюда и инверсия)». Замечательный ответ! Теперь я могу жить мирно! :) – ddinchev

+0

«Маска» - это то, что вы «маскируете» или «удаляете». Вот почему мы используем побитовое И («&» в C) для «маскировки» вещей. – Fixee