O status de saída para atribuições é estranho . A maneira mais óbvia de uma tarefa falhar é se a variável de destino estiver marcada com readonly
.
$ err(){ echo error ; return ${1:-1} ; }
$ PS1='$? $ '
0 $ err 42
error
42 $ A=$(err 12)
12 $ if A=$(err 9) ; then echo wrong ; else E=$? ; echo "E=$E ?=$?" ; fi
E=9 ?=0
0 $ readonly A
0 $ if A=$(err 10) ; then echo wrong ; else E=$? ; echo "E=$E ?=$?" ; fi
A: is read only
1 $
Observe que nem os caminhos verdadeiros nem falsos da instrução if foram considerados, mas a falha na atribuição interrompeu a execução de toda a instrução. bash no modo POSIX e ksh93 e zsh todos abortarão um script se uma atribuição falhar.
Para citar o padrão POSIX neste :
A command without a command name, but one that includes a command substitution, has an exit status of the last command substitution that the shell performed.
Esta é exatamente a parte da gramática de shell envolvida em
foo=$(err 42)
que vem de um simple_command
(simple_command → cmd_prefix → ASSIGNMENT_WORD). Portanto, se uma atribuição for bem-sucedida, o status de saída será zero, a menos que a substituição de comando esteja envolvida; nesse caso, o status de saída será o status do último. Se a atribuição falhar, o status de saída será diferente de zero, mas talvez não seja possível capturá-lo.