Em bash
, isso funciona:
loc(){ local "x=$(exit "$1"):$?"
printf '$%s:\t%d\n' \
x "${x##*:}" \? "$?"
}
Tem a ver com a ordem de avaliação de comando e atribuição de variável. local
tem um valor de retorno próprio - e é o comando atualmente em execução, não a substituição de comando. A razão pela qual as coisas gostam ...
x=$(exit 1); echo "$?"
... pode retornar 1 porque nunca há um retorno nesse comando, a não ser que a subshell execute para atribuir o valor de $x
- portanto, $?
não é afetado, como acontece em praticamente todos os outros casos em que as substituições de comando são usadas.
De qualquer forma, com local
é espancado - mas se você o captar na hora certa - que é enquanto as expansões ainda estão sendo avaliadas e antes As rotinas de local
têm a chance de derrotá-lo - você ainda pode atribuí-lo.
unset x; loc 130; echo "${x-\$x is unset}"
... imprime ...
$x: 130
$?: 0
$x is unset
Você deve saber que em muitos shells você não pode confiar em $?
sendo definido como mid-evaluation dessa maneira. Na verdade, isso é provavelmente porque essas shells não se incomodam em reavaliar em todas as ocasiões possíveis, como talvez bash
faça - o que eu diria é provavelmente um comportamento melhor do que bash
. Você realmente quer que o seu interpretador recursivamente valorize os valores de avaliação que provavelmente serão sobrescritos antes de você ter a chance de usá-los?
De qualquer forma, é assim que você pode fazer isso.