Terminal

A shell colon (:) não faz nada. Usa-a na mesma.

O comando : no shell/bash não faz absolutamente nada. Mas é uma das ferramentas mais úteis que tens no teu arsenal de scripting. Descobre porquê.

Escrevo shell scripts há mais de 15 anos e ainda descubro coisas que me fazem sentir um novato. A última foi o comando : (dois pontos). Um builtin do shell que não faz absolutamente nada. E é exatamente por não fazer nada que é tão útil.

O artigo de Filip Roséen, publicado a 23 de julho e atualizado a 26 de julho de 2026, apareceu no Hacker News e gerou uma discussão interessante sobre as peculiaridades do shell scripting. Um comentário resumiu perfeitamente: “o : não faz nada, o que faz dele o único comando bash que um LLM não consegue over-engineerar”.


O que é o :

: é o null-command do POSIX — um builtin que avalia os seus argumentos e descarta o resultado. Está no shell desde 1971 (Thompson shell), onde também servia como label e como o primeiro marcador de comentários do Unix.

A magia não está no que o : faz — que é nada — mas no que podes fazer com o facto de ele avaliar argumentos enquanto não faz nada.


Validação de argumentos em uma linha

O uso que me fez parar tudo e reescrever vários scripts:

# Antes: 4 linhas
if [ -z "$1" ]; then
   echo "missing argument, aborting." 1>&2
   exit 1
fi

# Depois: 1 linha
: "${1:?missing argument, aborting.}"

O ${var:?diagnostic} é uma expansão de parâmetro POSIX. Se a variável não estiver definida ou estiver vazia, imprime o diagnóstico em stderr e o shell termina com status não-zero. O : engole o resultado da expansão.

Com variáveis com nome:

: "${GREET_NAME:?missing argument, aborting.}"
$ bash greet.sh
greet.sh: line 1: GREET_NAME: missing argument, aborting.

O próprio nome da variável aparece no erro. Isto é mais informativo e mais idiomático do que um if-statement manual.


Valores por omissão

O : também permite definir defaults sem efeitos secundários:

: "${DATA_DIR:=/var/data}"    # define DATA_DIR se não estiver definida
: "${RETRIES:=3}"             # e descarta o resultado

Sem o :, o shell tentaria executar /var/data como um comando. Com o :, a expansão é feita e o resultado descartado. É uma forma limpa de definir variáveis com defaults que não interfere com o fluxo normal do script.


Truncar ficheiros

: > error.log                  # trunca error.log
: > error.log > access.log     # trunca ambos

O : não produz output, mas o redirecionamento > abre o ficheiro e trunca-o. O resultado é um ficheiro vazio. Mais limpo que echo -n > file ou true > file.


Placeholders e debugging

: funciona como placeholder para comandos que ainda vais escrever:

while : ; do
    # fazer coisas
    break
done

É um loop infinito legível. while true também funciona (hoje o true também é um builtin na maioria dos shells), mas o : é mais curto e existe desde o início.

Também serve para comentários multi-linha improvisados (embora : << 'EOF' ... EOF seja um here-document descartado, não um comentário verdadeiro).


O que aprendi

O : é uma daquelas ferramentas que não precisas — podes viver sem ela. Mas quando a conheces, começas a vê-la em todo o lado. Cada if-statement de validação de argumentos que escrevo agora parece desnecessariamente verboso.

O artigo do Roséen tem mais truques. Recomendo a leitura — mesmo que escrevas shell scripts há anos, aposto que aprendes alguma coisa.

Recursos adicionais

Partilhar

Comentários 0

Ainda sem comentários — sê o primeiro.