Esta resposta funciona em shells semelhantes a shells e shells semelhantes a csh, e não requer perl:
sh -c '<< other code >>; [ "$0" != "" ] && exit "$0"; exit "$1"' "$?" "$status"
ou você pode adicionar um parâmetro dummy / pad:
sh -c '<< other code >>; [ "$1" != "" ] && exit "$1"; exit "$2"' foo "$?" "$status"
e o teste pode ser alterado para [ ! -z "$0" ]
(ou "$1"
).
Não sei se vai funcionar em zsh ou fish.
Cada casca que conheço avaliará $?
e $status
quando o comando é analisado e passá-los para o comando sh -c
como parâmetros.
O shell sh
os atribui aos dois últimos parâmetros posicionais.
Quando o "outro código" terminar, o shell verificará o parâmetro posicional
que obteve seu valor de $?
para ver se é nula ou não nula,
e saia com o valor do parâmetro posicional apropriado.
Isso falhará se o shell do ambiente usar algo diferente de $?
ou $status
para manter o status de saída. Ele também falhará se o shell permitir que $?
seja definido
(não nulo) se não for o status de saída ou se $?
for uma sequência de caracteres inválida
que faz com que todo o comando seja rejeitado como um erro de sintaxe.