Que é mais idiomático em um script bash: '|| verdadeiro 'ou' || : '?

23

Eu não faço muito script de shell, então fiquei um pouco surpreso quando eu estava lendo a documentação para git submodule e eu vi a sintaxe que eles usaram nesta documentação:

A non-zero return from the command in any submodule causes the processing to terminate. This can be overridden by adding || : to the end of the command.

Eu tive que procurar que || : fosse uma forma abreviada de forçar um comando a sair com sucesso. Sempre que tive que fazer um comando sair com sucesso, usei || true . O || : é considerado mais idiomático?

    
por Mark Rushakoff 06.06.2013 / 06:54

3 respostas

29

true não foi incorporado ao shell Bourne. : sempre foi (foi a maneira de inserir comentários antes que # fosse introduzido).

Isso, e porque é mais curto para digitar, é provavelmente a principal razão pela qual as pessoas preferem : over true .

Observe outra diferença em shells POSIX (para bash , somente no modo POSIX): enquanto true é um builtin regular (nem precisa ser construído), : é um especial builtin. Isso tem algumas implicações, a maioria das quais é improvável que tenha algum impacto neste caso particular:

  • Se um comando : falhar, inclusive devido a um redirecionamento com falha, isso fará com que o shell saia. Na prática, isso provavelmente não fará diferença, a menos que você passe redirecionamentos para :

    $ sh -c ': > /   ; echo HERE'
    sh: 1: cannot create /: Is a directory
    $ sh -c 'true > /; echo HERE'
    sh: 1: cannot create /: Is a directory
    HERE
    
  • em var=value : , var permanece definido como value após : retornar, não no caso de true :

    $ var=1; var=2 :   ; echo "$var"
    2
    $ var=1; var=2 true; echo "$var"
    1
    

Observe também que || true funciona em shells das famílias rc e csh , mas não em || : (mas não para cancelar set -e in csh ).

|| : não é o mesmo que : . Isso significa ou executar : caso contrário (isto é, se o pipeline anterior falhar).

set -e
false

Faria com que o shell saia devido a set -e e false tenha um status de saída diferente de zero (falha). O efeito set -e é cancelado se o comando que retorna um status de saída diferente de zero for usado como condição , como em:

if false; then ...
while false; do ...
false && : ...
false || : ...

false && : apenas cancela set -e . false || : cancela set -e e define o status de saída para 0 , portanto, é mais idiomático dizer que queremos ignorar um código de saída de falha do comando. A maioria argumentaria que || true é mais legível (transmite a intenção com mais clareza).

    
por 06.06.2013 / 08:24
4

Geralmente, no bash, o cólon : e true é equivalente.

Is || : considered to be more idiomatic?

Acho que é baseado no contexto .

Se você quiser que um return value ou um condition seja sempre verdadeiro, use true keyword, isso tornará seu código mais claro e permitirá que os espectadores saibam que você deseja enfatizar o valor true , ou seja:

while true; do something

ou

<commnad>
RETURN_VALUE= $? || true

E se você quiser não fazer nada , ou NOP no shell, você deve usar os dois pontos :

if condition
then
    : # DO NOTHING HERE
else
    do something
fi 

ou

while conditon
do
    : # DO NOTHING HERE
done
    
por 06.06.2013 / 08:28
3

A maioria dessas respostas não aborda o uso mais comum de : .

Primeiro, esta discussão não está relacionada a nenhum shell que não seja derivado do Bourne shell ( sh ). Dito isto, todas as shells derivativas Bourne vêem true e : como a mesma coisa. Os programadores costumavam ser encorajados a usar : em vez de true , porque : é sempre interno enquanto costumava haver casos em que true nem sempre era interno.

: tem dois usos. Não é sinônimo de # , mas tem uma função diferente. Ao depurar seu script sob set -x , as linhas em que # é usado são descartadas pelo analisador e totalmente ignoradas, enquanto as linhas com : são analisadas e avaliadas. Isso é realmente útil na depuração, pois sob -x essas linhas são mostradas e seus valores após a avaliação são exibidos. É como colocar instruções print em seu código que são exibidas apenas no modo -x . Tenha cuidado com os valores após o : , pois eles são códigos reais e os efeitos colaterais podem afetar seu programa.

    
por 14.11.2013 / 18:36

Tags