Em Classic Shell Scripting da O'Reilly , Arnold Robbins e Nelson HF Beebe escrevem o seguinte exemplo:
$ umask 023 $ rm -f foo $ cp /bin/pwd foo $ ls -l /bin/pwd foo -rwxr-xr-x 1 root root 10428 2001-07-23 10:23 /bin/pwd -rwxr-xr-- 1 jones devel 10428 2002-09-21 16:37 foo
A sequência de permissões resultante
rwxr-xr--
reflete a perda de privilégios: o grupo perdeu o acesso de gravação e outros perderam o acesso de gravação e execução.
Agora, a 023
saída no início me diz que no shell atual, os arquivos recém-criados teriam w
o acesso removido para g
e wx
removido para o
, então, embora eu entenda que "outro perdeu o acesso de execução", não recebo "grupo perdeu o acesso de gravação" nem "outro perdeu o acesso de gravação", pois nenhum deles tinha isso em primeiro lugar.
Você acha que é apenas uma imprecisão na formulação desse comentário ou estou esquecendo de algo?
Além disso, tentei isso no meu sistema e o resultado me deixou um pouco mais intrigado:
$ umask
0023
$ cp /bin/pwd ~/foo
$ ls -l /bin/pwd ~/foo
-rwxr-xr-x 1 root root 35072 Jan 18 19:17 /bin/pwd*
-rw-r--r-- 1 myself myself 35072 Feb 1 12:54 /home/myself/foo
Agora, a saída de 0023
deveria significar a remoção de w
for g
e wx
for o
(dos quais apenas x
for o
estava realmente presente, então é o único removido neste caso), mas, em vez disso, parece que a x
permissão também foi removida para u
e g
.
Por que é que?
Onde posso encontrar todas as regras que determinam o que acontece, em termos de permissões, quando crio e quando copio um arquivo?
Eu tentei isso (arquivo de origem com permissões
-rwxr-xr-x
, umask definido como023
) com ocp
no macOS e ambos os GNU coreutilscp
e Busyboxcp
no Ubuntu. Todos eles criaram uma cópia com permissões-rwxr-xr--
, ou seja, copiando as permissões do original, mas modificado com o umask.É isso que o texto POSIX parece exigir , ele diz:
A última parte é um pouco estranha de ler, mas basicamente diz que o novo arquivo será criado com
open()
, usando os bits de permissão do arquivo de origem como o argumento 'mode' (ou por algum meio equivalente).Os bits fornecidos no argumento 'mode' são modificados pelo umask para obter as permissões resultantes.
Então, sim, no seu primeiro caso, de fato não parece haver um pouco de escrita de grupo a perder, a menos que eles tenham pensado em começar
0777
e remover o umask disso. Livros têm erros.No segundo caso, bem, parece que o seu
cp
não está em conformidade com POSIX. Isso seria um pouco surpreendente, no entanto, então talvez haja algo mais acontecendo? Por exemplo, se o arquivo de destinofoo
existisse antes da cópia, seus bits de permissão seriam mantidos como estão. (Ele será aberto apenas comO_TRUNC
. Isso é 3. a. ii. no texto.)Em qualquer caso, as permissões dos diretórios que os contêm não entram em jogo.