Considere el siguiente código
external-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; }
Estoy tratando de outer-scope.sh
salir cuando inner()
falla una llamada . Dado que $()
invoca un sub-shell, esto no sucede.
¿De qué otra manera obtengo el resultado de una función al tiempo que preservo el hecho de que la función puede salir con un código de salida distinto de cero?
echo $()
, podría ser porque los códigos de salida de las subcapas se ignoran cuando la línea, elecho
comando, tiene un código de salida (generalmente 0) propio.if ! $(exit 1) ; then echo $?; fi
, me sale0
. Noif
está seguro de cuál es el camino a seguir si necesita preservar ese valor de salida.if ! output=$(inner); then exit $?; fi
saldrá con un código de retorno de 0 porque$?
dará el código de retorno de en!
lugar del código de retorno deinner
. Puede obtener el comportamiento deseado,if output=$(inner); then : ; else exit $?; fi
pero eso es obviamente más detalladoVer BashFAQ / 002 :
Un caso especial
Tenga en cuenta un caso complicado con variables locales de función, compare el siguiente código:
Nosotros recibiremos:
¿Por qué?
Cuando la salida de una subshell se usa para inicializar una
local
variable, el estado de salida ya no es de la subshell, sino del comando , que es más probable que sea .local
0
Ver también https://stackoverflow.com/a/4421282/537554
fuente
Al agregar
echo
, el subshell no está solo (no se verifica por separado) y no se cancela. La asignación evita este problema.También puede hacer esto y redirigir la salida a un archivo para luego procesarlo.
fuente