O problema com esse estilo é que os dois formulários não são equivalentes. Quando você usa:
if command; then
foo
else
bar
fi
então foo
ou bar
serão chamados, nunca os dois. Ao usar os dois &&
e ||
, ambos os caminhos podem ser obtidos:
$ [[ -d / ]] && {
> echo "Path 1 taken"
> false
> } || {
> echo "Path 2 taken"
> }
Path 1 taken
Path 2 taken
$
Ao usar o formulário if cmd; then foo; else bar; fi
, a condição para o bar
que está sendo chamado é cmd
retornando false. Ao usar o formulário cmd && foo || bar
, a condição para o bar
que está sendo chamado é cmd && foo
retornando false.
EDIT: Eu só notei que na sua pergunta você reconhece que você precisa colocar true
no final dos blocos para fazer sua versão funcionar em tudo. Se você está disposto a fazer isso, eu não estou ciente de quaisquer outras questões importantes - mas eu diria que um estilo que requer que você adicione incondicionalmente "verdadeiro" como o último comando em um bloco, se houver alguma possibilidade de que o comando anterior pode falhar apenas garante que você acabará esquecendo, e as coisas vão parecer que estão funcionando corretamente até que eles não o façam.