Considere o seguinte código
outer-scope.sh
#!/bin/bash
set -e
source inner-scope.sh
echo $(inner)
echo "I thought I would've died :("
inner-scope.sh
#!/bin/bash
function inner() { echo "winner"; return 1; }
Estou tentando outer-scope.sh
sair quando uma chamada inner()
falha. Desde que $()
invoca um sub-shell, isso não acontece.
De que outra forma eu obtenho a saída de uma função, preservando o fato de que a função pode sair com um código de saída diferente de zero?
echo $()
, talvez seja porque os códigos de saída dos subshells são ignorados quando a linha - oecho
comando - possui um código de saída (geralmente 0).if ! $(exit 1) ; then echo $?; fi
, entendo0
. Não tenho certezaif
do caminho a seguir, se você precisar preservar esse valor de saída.if ! output=$(inner); then exit $?; fi
sairá com um código de retorno 0, porque$?
fornecerá o código de retorno em!
vez do código de retorno deinner
. Você poderia obter o comportamento desejado comif output=$(inner); then : ; else exit $?; fi
mas isso é, obviamente, mais detalhadoConsulte BashFAQ / 002 :
Um caso especial
Observe sobre um caso complicado com variáveis locais de função, compare o seguinte código:
Nós conseguiremos:
Por quê?
Quando a saída de um subshell é usada para inicializar uma
local
variável, o status de saída não é mais do subshell, mas do comando , o que é mais provável .local
0
Consulte também https://stackoverflow.com/a/4421282/537554
fonte
Ao adicionar
echo
, o subshell não fica sozinho (não é verificado separadamente) e não aborta. A atribuição contorna esse problema.Você também pode fazer isso e redirecionar a saída para um arquivo, para processá-lo posteriormente.
fonte