Qual é o ponto do bash Operador-nulo “:”, dois pontos?

8

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?

    
por Justin 14.11.2014 / 15:55

5 respostas

13

À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"
    
por glenn jackman 14.11.2014 / 16:00
10

Você também pode usá-lo para loops infinitos:

while : ; do 
   # ....
done
    
por choroba 14.11.2014 / 16:04
7

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:

  • Isso não verifica se o arquivo já existe. Se isso não acontecer, isso criará o arquivo se ele tiver permissão para fazê-lo.
  • Se o arquivo não existir e seu script não tiver permissão para criá-lo, isso informará "permissão de gravação negada".

(Veja a pergunta vinculada por razões pelas quais isso é mais confiável do que if [ -w /path/to/file ] .)

    
por G-Man 14.11.2014 / 19:19
0

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).
....
    
por Michael J 29.11.2016 / 23:07
0

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 .

    
por Sergiy Kolodyazhnyy 02.06.2018 / 00:46