umask in mode umrechnen

Bash, Shell, PHP, Python, Perl, CGI
User avatar
daemotron
Administrator
Administrator
Posts: 2635
Joined: 2004-01-21 17:44

umask in mode umrechnen

Post by daemotron » 2010-03-28 15:14

Moin,

gibt es einen eleganten Weg, in einem Shell-Skript eine gegebene UMASK in einen MODE (für chmod, z. B.) umzurechnen - und zwar abhängig davon, ob es sich um eine Datei oder ein Verzeichnis handelt? 3stellige umasks wären mir schon genug (es geht um FTP). Ach ja: Übersetzungstabellen à la grep aus allen Linarkombinationen oder monsterverschachtelte if oder case Blöcke würden zwar gehen, erfüllen aber nicht das Eleganz-Kriterium :wink:

Beispiel:

Code: Select all

umask=027
mode_file(umask) => 640
mode_dir(umask)  => 750

In C wäre das kein Problem, aber ich bin auf Gedeih und Verderb an ein Shell-Skript gebunden :?
“Some humans would do anything to see if it was possible to do it. If you put a large switch in some cave somewhere, with a sign on it saying 'End-of-the-World Switch. PLEASE DO NOT TOUCH', the paint wouldn't even have time to dry.” — Terry Pratchett, Thief of Time

dotme
Posts: 150
Joined: 2004-12-15 16:48

Re: umask in mode umrechnen

Post by dotme » 2010-03-28 15:40

Nur mal so als Idee:

Code: Select all

MY_UMASK=`umask`
printf "%04o\\n"  $(( 0777 & ~ $MY_UMASK  ))


Geht in der bash mit coreutils. Mit dem Quoting des Newline bin ich mir nicht sicher.

User avatar
daemotron
Administrator
Administrator
Posts: 2635
Joined: 2004-01-21 17:44

Re: umask in mode umrechnen

Post by daemotron » 2010-03-28 16:11

$(( bedeutet "berechne diesen Ausdruck". & ist binäres AND, ~ ist binäres invertieren. Hier wird also MY_UMASK binär invertiert, dann mit 0777 binär "ver-UND-ed".

Hab's eben mal angetestet, funktioniert tatsächlich auch auf dem in FreeBSD enthaltenen Ash-Ableger. Ich weiß allerdings nicht, ob $(( POSIX-konform oder eine proprietäre Erweiterung ist, die zufällig von Bash und FreeBSD-sh verstanden wird.

P. S. Vielen Dank dotme, mir war nicht bewusst, dass $(( auch binäre Operationen unterstützt!
Last edited by daemotron on 2010-03-28 16:23, edited 2 times in total.
“Some humans would do anything to see if it was possible to do it. If you put a large switch in some cave somewhere, with a sign on it saying 'End-of-the-World Switch. PLEASE DO NOT TOUCH', the paint wouldn't even have time to dry.” — Terry Pratchett, Thief of Time