- O
: do shell é um comando nulo (null command) que não executa nenhuma ação e apenas avalia os argumentos; combinado com expansão de parâmetros, permite lidar de forma concisa com a verificação de argumentos obrigatórios e a definição de valores padrão
: "${1:?missing argument, aborting!}" imprime uma mensagem de diagnóstico em stderr e encerra com status diferente de 0 se $1 estiver ausente ou vazio
- Ao passar
${VAR:=default} como argumento de :, a expansão é executada, mas a string resultante é descartada; assim, é possível definir apenas o valor padrão sem executar o resultado da expansão como comando
: também pode ser usado para esvaziar arquivos via redirecionamento e verificar acessibilidade, como comando vazio em trap, para verificar variáveis em ambientes com set -u e em ramificações condicionais vazias
: "${VAR:=default}" reduz a chance de erros de digitação ao escrever o nome da variável apenas uma vez; em while :, torna-se uma condição sempre bem-sucedida e expressa um loop infinito
Comando nulo e expansão de parâmetros
: é um comando interno nulo que avalia os argumentos e descarta o resultado
- Remonta ao Thompson shell, de 1971, e na época também era usado como rótulo e como o primeiro marcador de comentário do Unix
- Em vez de uma condicional de quatro linhas, é possível verificar um argumento obrigatório com a seguinte linha única
: "${1:?missing argument, aborting!}"
echo "Hello $1!"
- A sintaxe de expansão de parâmetros
${name:?diagnostic} verifica se $name não foi definido ou está vazio
- Se não houver valor, imprime
diagnostic em stderr e encerra o shell com status diferente de 0
- Se houver valor, produz o mesmo resultado que
$name
- Se
${HELLO:=123} for executado sozinho, sem o comando nulo, o resultado da expansão, 123, será tratado como comando e causará command not found
: ${HELLO:=123} avalia a expansão, define HELLO=123 e descarta o resultado
: "${DATA_DIR:=/var/data}", ao contrário de DATA_DIR="${DATA_DIR:-/var/data}", exige escrever o nome da variável apenas uma vez, reduzindo a chance de erros de digitação como DATA_DRI
Como usar :
-
Definição de valores padrão
- Define valores padrão de variáveis enquanto descarta o resultado da expansão, sem executá-lo
: "${DATA_DIR:=/var/data}"
: "${RETRIES:=3}"
-
Esvaziar arquivos e verificar acesso
- Combinado com redirecionamento, pode esvaziar um ou mais arquivos
: > error.log
: > error.log > access.log
- Usando subshell e redirecionamento, também é possível verificar se um arquivo pode ser lido ou escrito
( : < dataset.json ) && echo YES
( : >> result.json ) && echo YES
-
Locais que exigem um comando vazio
- Pode ser usado quando a sintaxe exige um comando, como em
trap, mas nenhuma ação real deve ser executada
trap : INT
sleep 60
- Também pode ser colocado em ramificações que devem ficar vazias em condicionais
if some-command; then
:
else
echo "command failed"
fi
-
Verificação de várias variáveis
- Com
set -u ativado, verifica de uma só vez se várias variáveis foram definidas
set -u
: "$DEPLOY_ENV" "$HOST"
-
Loop infinito
- Como
: é uma condição que sempre tem sucesso, permite escrever um loop infinito de forma concisa
while :; do
echo "I love colons"
sleep 1
done
1 comentários
Comentários no Lobste.rs
: hayalci@tassadar ~/src/dool ; jj rebase -s dxw -d mrnautocddo shell e o seguinte formato~/directoryname; <command>Sempre que copiar a linha de comando do shell, ele continua dando
cdpara o diretório onde o comando foi executado originalmentezsh, a configuração faz com que, ao colar um espaço sem quebra de linha invisível, o conteúdo à esquerda seja apagadomakepode executar vários processosechoao mesmo tempo, escrevendo no mesmo stream e interferindo uns nos outros. Se mudar para o formato abaixo, quem imprime é o próprio processomake, não um processo filhoman :ouwhatis :É parecido com o comando
true, mas a diferença é que não reage de forma especial a--help,--versionetc., além de ter menos caractereshelp, em vez deman:é literalmente um alias detruePorém, eu não tinha pensado em usar isso para efeitos colaterais causados pela avaliação dos argumentos
:, também é possível prefixar com#e salvar como comentário. Se for algo para executar depois, isso tem a vantagem de não avaliar previamente as expressões dentro delehttps://nathangrigg.com/2014/04/zsh-push-line-or-edit/
-bash: !}": event not found"!"while true; do...while true; dotem só três caracteres a mais quewhile :; do, então já é curto o suficiente; esse código não parece um bom exemplo para o ponto que o autor quer transmitir