Por que o padrão é “comando || verdadeiro ”útil?

71

Atualmente estou explorando os pacotes Debian e tenho lido alguns exemplos de código. E em todas as linhas, por exemplo, o script postinst é um padrão.

some command || true
another command || true

Portanto, se algum comando falhar, a linha retorna true, mas não vejo como isso afeta a saída do programa.

    
por carpenter 24.11.2016 / 11:49

2 respostas

136

A razão para este padrão é que scripts de mantenedores em pacotes Debian tendem a começar com set -e , o que faz com que o shell saia assim que qualquer comando (estritamente falando, pipeline, lista ou comando composto) sair com um status zero. Isso garante que os erros não se acumulem: assim que algo dá errado, o script é abortado.

Nos casos em que um comando no script pode falhar, a adição de || true garante que o comando composto resultante sempre saia com o status zero, portanto, o script não é interrompido. Por exemplo, remover um diretório não deve ser um erro fatal (impedindo que um pacote seja removido); então usaríamos

rmdir ... || true

desde que rmdir não tenha uma opção para dizer a ele para ignorar erros.

    
por 24.11.2016 / 12:51
31

Embora isso não afete a saída do programa que acabou de ser executado - ele permite que o chamador prossiga como se tudo estivesse bem, o que também afeta a lógica futura.

Reformeado: mascara o erro status do comando anterior.

michael@x071:[/usr/sbin]cat /tmp/false.sh
#!/bin/sh
false

michael@x071:[/usr/sbin]cat /tmp/true.sh 
#!/bin/sh
false || true

michael@x071:[/usr/sbin]sh /tmp/false.sh; echo $?
1
michael@x071:[/usr/sbin]sh /tmp/true.sh; echo $? 
0
    
por 24.11.2016 / 12:19