2012-07-02 8 views
11

W większości miejsc, uprawnienia są zdefiniowane jako liczba ósemkowa w formacie 0777. Jednak komenda UNIX umask (a więc os.umask()) potrzebuje 0o000 do wygenerowania bitów uprawnień z 0o777 i 0o022 w moim rozumieniu na 0o755.Dlaczego argument os.umask() jest odwrócony? (umask 0o000 powoduje chmod 0o777)

Słyszałem, że UNIX's umask jest z jakiegoś powodu odwrócony i nie rozumiem powodu. Czy ktoś mógłby wyjaśnić tę niespójność?

+2

To "maska" - to właśnie oznacza słowo w tym kontekście; coś, co pozwala tylko na niewykonanie bitów (pomyśl o maskach używanych do malowania, tworzenia układów scalonych i tym podobnych). Gdyby nie działało w ten sposób, byłoby to nazwane czymś innym. –

Odpowiedz

11

Nie ma prawdziwej niespójności, ponieważ relacja między umask i chmod może być czysto zapisana za pomocą równań. Najwyraźniej umask ustawia przeciwieństwo chmod, tak zostało stworzone w dawnych czasach.

Przykład: 022 (domyślnie zwykły umask) tworzy 755. To działa tak:

  • 7 - 0 = 7 staje pierwszy bajt
  • 7 - 2 = 5 staje się drugim i trzecim bajty

Korzystanie z tego przykładu, umask 777 tworzy plik z chmod 000, umask 112 będzie równa chmod 664. O ile mi wiadomo, stało się tak dlatego, że polecenie umask zostało pierwotnie utworzone w celu wskazania, jakie bity uprawnień pliku będą miały po utworzeniu (stąd inwersja).

Chociaż może to być denerwujące, naprawdę nie jest trudno przyzwyczaić się do tego. Po prostu pomyśl, w jaki sposób chcesz chmod swoich plików i odjąć bajt, który chcesz od 7, a otrzymasz wartość umask. Lub, gdy jesteś w IDE, pisząc swój kod, nie używaj umask, ale raczej stwórz plik (z domyślnie umask), a następnie użyj, w Pythonie, os.chmod() zamiast tego.

+0

"O ile mi wiadomo, stało się tak dlatego, że polecenie umask zostało pierwotnie stworzone, aby wskazać, jakie bity uprawnień plik NIE będzie miał po utworzeniu (stąd inwersja)." Wspaniała odpowiedź! Teraz mogę żyć spokojnie! :) – ddinchev

+0

"Maska" to coś, co "maskujesz" lub "usuwamy". Dlatego używamy bitowego AND ("&" w C), aby "maskować" rzeczy. – Fixee

Powiązane problemy