chmod +x
chmod +x arquivo liga o bit de execução para o arquivo poder rodar direto (./arquivo). Sem u, g, o ou a na frente, vale para as três classes menos as que o umask bloqueia, então com o umask comum 022 equivale a a+x.
Resultado em modos de partida comuns
| Antes | Depois, umask 022 | Depois, umask 077 |
|---|---|---|
644 rw-r--r-- | 755 rwxr-xr-x | 744 rwxr--r-- |
600 rw------- | 711 rwx--x--x | 700 rwx------ |
640 rw-r----- | 751 rwxr-x--x | 740 rwxr----- |
664 rw-rw-r-- | 775 rwxrwxr-x | 764 rwxrw-r-- |
444 r--r--r-- | 555 r-xr-xr-x | 544 r-xr--r-- |
Quem recebe a execução: a regra do umask
Quando o modo simbólico não indica usuários, o chmod age como se fosse a (todos), mas não mexe em nenhum bit que esteja ligado no seu umask. O manual do GNU coreutils descreve isso em "The Umask and Protection". Quem decide o resultado é o umask: com 022 nenhum bit de execução é bloqueado, então todos recebem x; com 077 grupo e outros ficam bloqueados, e só o dono recebe x.
Por isso chmod +x num arquivo 600 pode resultar em 711: o dono ganha x, e grupo e outros também. Eles continuam sem leitura, então um script segue inútil para eles, mas um binário compilado passa a rodar. Use u+x quando quiser só o dono.
Rodando o arquivo depois
A permissão de execução deixa o kernel rodar o arquivo. Um script também precisa de uma primeira linha indicando o interpretador, como #!/bin/sh ou #!/usr/bin/env python3, e quem executa precisa de leitura para o interpretador abrir o arquivo.
Se ./script.sh continua com Permission denied depois do chmod +x, veja se o sistema de arquivos está montado com noexec (comum em /tmp, /dev/shm e pendrives): o findmnt mostra as opções, e bash script.sh funciona de qualquer jeito porque só lê o arquivo.
chmod +x deploy.sh
./deploy.sh
findmnt -no OPTIONS --target deploy.sh # procure por noexecMantendo o bit de execução no Git
O Git só registra se o arquivo é executável: modo 100755 quando o bit de execução do dono está ligado, 100644 caso contrário. No Windows, ou em qualquer clone com core.fileMode false, o chmod não muda o que o Git guarda, então ligue o bit direto no índice.
git add --chmod=+x deploy.sh
# ou, para um arquivo já versionado:
git update-index --chmod=+x deploy.sh
git ls-files -s deploy.sh # mostra 100755Perguntas frequentes
- O que o chmod +x faz?
- Adiciona permissão de execução, para o arquivo rodar como programa. Com o umask comum 022, dá execução para dono, grupo e outros.
- Qual a diferença entre chmod +x e chmod 755?
- O chmod +x só adiciona bits de execução e mantém o resto. O chmod 755 substitui o modo inteiro. Num arquivo 644 os dois dão 755; num arquivo 600 o +x dá 711, e o 755 ainda deixaria o arquivo legível para todos.
- Uso chmod +x ou chmod u+x?
- u+x quando só você deve rodar, ou quando quer um resultado que não dependa do umask. +x para scripts que qualquer usuário da máquina pode rodar.
- Como tirar a permissão de execução?
- chmod -x arquivo tira (sujeito à mesma regra do umask); chmod a-x arquivo tira de todos independentemente do umask.
Revisado em por Arielton Oberek.