O que é mais idiomático em um script bash: `|| true` ou `|| : `?

36

Como não faço muito scripts de shell, fiquei um pouco surpreso ao ler a documentaçãogit submodule e vi a sintaxe que eles usavam nesta documentação:

Um retorno diferente de zero do comando em qualquer submódulo faz com que o processamento seja finalizado. Isso pode ser substituído, adicionando || :ao final do comando.

Eu tive que procurar que || :era uma abreviação para forçar um comando a sair com sucesso. Sempre que eu tinha que fazer um comando sair com sucesso, eu costumava || true. É || :considerado mais idiomático?

Mark Rushakoff
fonte
Vale a pena notar que ||:(sem espaço) também é válido no bash. Faz a mesma coisa que || :ou || true.
precisa saber é o seguinte

Respostas:

38

truenão foi construído no shell Bourne. :sempre foi (era a maneira de inserir comentários antes de #ser introduzido).

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

Observe outra diferença nos shells POSIX (pois bash, apenas no modo POSIX): enquanto trueé um built-in regular (nem precisa ser construído), :é um built-in especial . Isso tem algumas implicações, a maioria das quais é improvável que tenha algum impacto nesse caso específico:

  • Se um :comando falhar, inclusive devido a um redirecionamento com falha, isso fará com que o shell seja encerrado. 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
    
  • in var=value :, varpermanece definido como valueapós :retornos, não no caso de true:

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

Além disso, note que as || trueobras em conchas do rce cshfamílias, mas não || :(mas não para cancelar set -eem csh).

|| :não é o mesmo que :. Significa ou é executado de :outra forma (ou seja, se o pipeline anterior falhar).

set -e
false

Faria com que o shell para sair por causa de set -ee falsetem um status de saída diferente de zero (falha). O set -eefeito será cancelado se o comando que retorna um status de saída diferente de zero for usado como uma condição, como em:

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

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

Stéphane Chazelas
fonte
5
&& :é brilhante, existem documentos ou leituras adicionais sobre isso? Google está aquém de mim tentando encontrar este tipo de palavras-chave ...
Ian Bytchek
5

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

É || : considerado mais idiomático?

Eu acho que é baseado no contexto .

Se você deseja a return value, ou a conditioné sempre verdadeiro, use a truepalavra-chave, isso tornará seu código mais claro e permitirá que os espectadores saibam que você deseja enfatizar o valor verdadeiro , ou seja:

while true; do something

ou

<commnad>
RETURN_VALUE= $? || true

E se você não quiser fazer nada , ou NOPcom casca, use dois pontos:

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

ou

while conditon
do
    : # DO NOTHING HERE
done
cuonglm
fonte
5

A maioria dessas respostas falha ao abordar o uso mais comum de :.

Primeiro, essa discussão não está relacionada a nenhum shell que não seja um derivado Bourne shell ( sh). Dito isto, todas as conchas derivadas de Bourne veem truee :são a mesma coisa. Os programadores costumavam ser incentivados a usar, em :vez de true, porque :sempre é um componente interno, enquanto costumava haver casos em que truenem sempre era um componente interno.

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

cdr
fonte
1
Qual é o segundo uso?
Peter Mortensen