2012-07-02 8 views
11

In den meisten Orten sind Berechtigungen als eine Oktalzahl im Format 0777 definiert. Aber UNIX umask Befehl (also os.umask()) benötigt 0o000, um die Erlaubnis Bits von 0o777 und 0o022 entspricht 0o755 in meinem Verständnis.Warum wird das Argument von os.umask() invertiert? (umask 0o000 macht chmod 0o777)

Ich habe gehört, dass UNIX umask aus irgendeinem Grund invertiert ist und ich verstehe nicht den Grund dafür. Könnte jemand bitte diese Unbeständigkeit erklären?

+2

Es ist eine "Maske" - das bedeutet das Wort in diesem Zusammenhang; etwas, das nur die unscharfen Bits durchlässt (denke an die Masken, die für das Malen, die Chipherstellung und dergleichen verwendet werden). Wenn es nicht so funktioniert, würde es etwas anderes genannt werden. –

Antwort

11

Es gibt keine echte Inkonsistenz, da die Beziehung zwischen umask und chmod rein mit Gleichungen geschrieben werden kann. Anscheinend setzt umask das Gegenteil von chmod, es wurde so in den alten Tagen wieder hergestellt.

Beispiel: 022 (die Standardeinstellung umask) erstellt 755. Es funktioniert wie folgt:

  • 7 - 0 = 7 wird das erste Byte
  • 7 - 2 = 5 der zweiten und dritten Bytes

Mit diesem Beispiel wird erstellt umask 777 eine Datei mit chmod 000 wird umask 112 zu chmod 664 gleich sein. Soweit ich weiß, geschah dies, weil der Befehl umask ursprünglich erstellt wurde, um anzuzeigen, welche Berechtigungsbits die Datei NICHT haben wird, nachdem sie erstellt wurde (daher die Umkehrung).

Während es lästig sein könnte, ist es wirklich nicht schwer, sich daran zu gewöhnen. Denken Sie einfach, wie Sie chmod Ihre Dateien würden, und subtrahieren Sie das gewünschte Byte von 7, und Sie erhalten den umask Wert. Oder, wenn Sie in der IDE sind, schreiben Sie Ihren Code, verwenden Sie nicht umask, sondern erstellen Sie die Datei (mit dem Standard umask natürlich) und verwenden Sie dann in Python os.chmod() statt.

+0

"Soweit ich weiß, geschah dies, weil der umask-Befehl ursprünglich erstellt wurde, um anzuzeigen, welche Berechtigungsbits die Datei NICHT haben wird, nachdem sie erstellt wurde (daher die Umkehrung)." Wunderbare Antwort! Jetzt kann ich friedlich leben! :) – ddinchev

+0

Eine "Maske" ist etwas, das du "maskierst" oder "entfernst". Deshalb verwenden wir das bitweise AND ("&" in C), um Dinge zu "maskieren". – Fixee