Ambas as linhas de comando são portáteis. E ambos têm o mesmo efeito.
Em relação ao segundo: no caso de $foo
falhar, echo 0
não é avaliado, portanto echo $?
imprime o status de saída do último comando, ou seja, $foo
.
Os operadores lógicos são associativos à esquerda, ou seja, a segunda linha de comando é equivalente a:
$ { $foo && echo 0 } || echo $?
(onde o primeiro $
indica o prompt do shell)
Linguagem de Comando da Shell padroniza listas de comandos, associatividade de operadores e assim por diante.
A seção 2.9.3 da Linguagem de comando do shell também especifica a semântica do status de saída do & ; & operador:
Exit Status
The exit status of an AND list shall be the exit status of the last command that is executed in the list.
Em relação ao seu postscript: Sim, o POSIX não permite isso.