Skip to content

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

Modo antes e depois do comando
AntesDepois, umask 022Depois, umask 077
644 rw-r--r--755 rwxr-xr-x744 rwxr--r--
600 rw-------711 rwx--x--x700 rwx------
640 rw-r-----751 rwxr-x--x740 rwxr-----
664 rw-rw-r--775 rwxrwxr-x764 rwxrw-r--
444 r--r--r--555 r-xr-xr-x544 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 noexec

Mantendo 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 100755

Perguntas 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.