Estou tentando entender melhor as permissões, então estou fazendo alguns "exercícios". Aqui está uma sequência de comandos que estou usando com a respectiva saída:
$ umask
0022
$ touch file1
$ ls -l file1
-rw-r--r-- 1 user group 0 Mar 16 12:55 file1
$ mkdir dir1
$ ls -ld dir1
drwxr-xr-x 2 user group 4096 Mar 16 12:55 dir1
Isso faz sentido porque sabemos que as permissões de arquivo padrão são 666( rw-rw-rw-) e as permissões padrão de diretório são 777( rwxrwxrwx). Se eu subtrair o valor umask dessas permissões padrão 666-022=644, tenho
rw-r--r--, para o file1, portanto, é coerente com a saída anterior;
777-022=755,, rwx-r-x-r-xpara o dir1, também coerente.
Mas se eu mudar a umask de 022para 021não é mais.
Aqui está o exemplo para o arquivo:
$ umask 0021
$ touch file2
$ ls -l file2
-rw-r--rw- user group 0 Mar 16 13:33 file2
-rw-r--rw-é 646mas deveria ser 666-021=645. Portanto, não funciona de acordo com o cálculo anterior.
Aqui está o exemplo para o diretório:
$ touch dir2
$ ls -ld dir2
drwxr-xrw- 2 user group 4096 Mar 16 13:35 dir2
drwxr-xrw-é 756, 777-021=756. Portanto, neste caso, o resultado é coerente com o cálculo anterior.
Eu li o homem, mas não encontrei nada sobre esse comportamento.
Alguém pode explicar o porquê?
EXPLICAÇÃO
Conforme indicado nas respostas: umasko valor de não é matematicamente subtraído do diretório padrão e das permissões do arquivo.
A operação efetivamente envolvida é uma combinação de operadores booleanos AND (&) e NOT (!). Dado:
R = permissões resultantes
D = permissões padrão
U = umask atual
R = D &! U
Por exemplo:
666 &! 0053 = 110 110 110 &
000 000 011
110 110 110 &
111 010 100
= 110 010 100 = 624 = rw - wr--
777 &! 0022 = 111 111 111 &
000 000 010 010
111 111 111 &
111 101 101
= 111 101 101 = 755 = rwxr - xr-x
GORJETA
Uma maneira fácil de conhecer rapidamente as permissões resultantes (pelo menos isso me ajudou) é pensar que podemos usar apenas três valores decimais:
r = 100 = 4
w = 010 = 2
x = 001 = 1
As permissões serão uma combinação desses 3 valores.
" "é usado para indicar que a permissão relativa não é fornecida.
666 = 4+2+" " 4+2+" " 4+2+" " = rw rw rw
Portanto, se minha umask atual for 0053sei que estou removendo a (4+1) permissão de leitura e execução do grupo e a gravação e execução (2+1)de outras resultando em
4+2 " "+2+" " 4+" "+" " = 624 = rw--w-r--
(grupo e outro já não tinham permissão de execução)