Às vezes é útil permitir a ocorrência de efeitos colaterais de expansões de parâmetros.
Por exemplo, definir um valor padrão
read -p "Enter your name: " name
: ${name:=John Doe} # if the user entered an empty string
echo "$name"
Qual é o objetivo do operador "null" em um script BASH? Eu entendo que ele é usado como um espaço reservado após um comando if
quando você não tem nada a dizer, mas precisa de um comando para permitir que o programa seja executado corretamente. Mas qual é o uso geral para isso? Quando você usaria isso? Quando faz sentido usá-lo?
Às vezes é útil permitir a ocorrência de efeitos colaterais de expansões de parâmetros.
Por exemplo, definir um valor padrão
read -p "Enter your name: " name
: ${name:=John Doe} # if the user entered an empty string
echo "$name"
Você também pode usá-lo para loops infinitos:
while : ; do
# ....
done
Você pode usá-lo para criar um arquivo sem executar um programa:
: > /path/to/file
Isso é infinitesimalmente mais rápido que touch /path/to/file
(uma vez que não requer a execução do programa touch
)
e pode ser marginalmente mais portátil do que simples
> /path/to/file
que parece funcionar em muitos sistemas. Da mesma forma, ele pode ser usado para verificar se você tem acesso de gravação a um arquivo :
if { : >> /path/to/file;} 2> /dev/null
then
echo "writeable"
else
echo "write permission denied"
fi
embora isso, também, geralmente possa ser feito sem o :
. Advertências:
(Veja a pergunta vinculada
por razões pelas quais isso é mais confiável do que if [ -w /path/to/file ]
.)
Acabei de usá-lo em um script com comandos SSH para impedir que o script seja acionado.
Nesse caso, quero ver se um usuário pode se conectar a um conjunto de servidores. Se a conexão estiver OK, o host remoto fará o eco OK. Se a conexão falhar, o SSH responderá com o erro. No entanto, quero que meu script saia com 0 e não o valor do comando SSH se ele falhar. Então, basicamente eu interceptar o erro SSH, ORing ||
com o comando nulo :
. Parece assim:
#!/bin/bash
for i in $(cat servers.txt); do
echo -n "$i ";
ssh user@${i} 'echo OK' || :;
done
Dessa forma, recebo a saída do SSH, mas não o código de erro:
....
swl06 ok
swl07 ok
swl08 Permission denied (publickey,gssapi-keyex,gssapi-with-mic,password).
swl09 ok
swl10 Permission denied (publickey,gssapi-keyex,gssapi-with-mic,password).
....
De volta ao Unix V6 e Thompson Shell, o :
foi realmente usado como parte da declaração goto
, que de acordo com o manual apareceu originalmente na versão 3 do Unix. Cite o manual:
O arquivo de comando inteiro é procurado por uma linha que começa com a: como o primeiro caractere não vazio, seguido por um ou mais espaços em branco e, em seguida, o rótulo. Se tal linha for encontrada, goto reposiciona o deslocamento do arquivo de comando para a linha após o rótulo e sai. Isso faz com que o shell seja transferido para a linha rotulada.
Hoje em dia, em bash
é usado como operador sem operação e retorna um sucesso em qualquer execução. Na verdade, ele compartilha a mesma base de código com o comando interno true
. Se você olhar para o código-fonte , você verá que true
e :
usam a mesma função int collon_builtin()
abaixo. Não há nenhum comando :
non-builtin e true
não construído é, na verdade, um comando razoavelmente grande pelo que faz.
Entre outros usos, pode ser usado em qualquer lugar true
é usado, entre os quais command_that_can_fail || true
tipo de estrutura, ou seja, seria bom fazer command || :
, mas provavelmente não muito legível e confuso. Leia mais sobre isso aqui .