Page 1 of 1

umask in mode umrechnen

Posted: 2010-03-28 15:14
by daemotron
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 :?

Re: umask in mode umrechnen

Posted: 2010-03-28 15:40
by dotme
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.

Re: umask in mode umrechnen

Posted: 2010-03-28 16:11
by daemotron
$(( 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!