É possível representar a permissão simbólica +X com um valor octal? A página de manual chmod(1) diz:
execute/pesquise somente se o arquivo for um diretório ou já tiver permissão de execução para algum usuário
o que significa que chmod -R g+X
adicionará a permissão de execução do grupo somente se já houver um bit de execução definido para usuário, grupo ou outro. Você certamente poderia fazer isso da maneira mais difícil com find:
find . -perm /ugo=x -exec chmod g+x {} \;
No entanto, não é óbvio como alguém poderia fazer a mesma coisa com um modo octal sem usarencontraroutestepara verificar as permissões do arquivo primeiro. Isso é possível ou existem algumas áreas onde as permissões simbólicas e octais simplesmente não se sobrepõem?
Responder1
O conto: não é possível, não.
A história mais longa: permissões octais são estados. A [+-][rwxXst]
notação representa operations
que culminam na mudança de estados. Observe, não =[rwxXst]
aquele, queconjuntosestado e é equivalente aos modos octais, como disse Gilles. Uma X
é a única operação condicional, as outras são todas incondicionais.
Ao criar chmod
um arquivo com permissões octais, você fornece o finalestadodos bits de permissão literalmente. Ao usar as operações, você escolhe o que desejafeitopara os bits de permissão.
Sua pergunta equivale a perguntar se existe um único número que representa todas as raízes quadradas. A resposta é obviamente “não”: cada raiz quadradarendimentosum número (pedantes: embora possa ser imaginário/irracional), mas sem o inícioestado(o número), você não sabe qual.
Responder2
Os modos simbólicos são mais expressivos que os modos octais, porque os modos octais só podem expressar mudanças absolutas. Mudanças relativas, o que significa não apenas, +X
mas qualquer modo que não especifique todos os novos bits (como g+x
— ou mesmo a+rwx
, que não remove nenhum bit setuid/setgid), não podem ser expressas com modos octais.
Por outro lado, qualquer modo octal pode ser expresso como um modo simbólico, em geral usando =
, por exemplo, 4750
= u+rwxs,g=rx,o-rwxt
(ou u=rwxs,g=rx,o=
ou muitas outras combinações).