Rozważ następujący kod
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; }
Próbuję outer-scope.sh
wyjść, gdy połączenie się inner()
nie powiedzie. Ponieważ $()
wywołuje podpowłokę, tak się nie dzieje.
Jak inaczej uzyskać wynik działania funkcji, zachowując fakt, że funkcja może wyjść z niezerowym kodem wyjścia?
echo $()
to, może to być spowodowane tym, że kody wyjścia podpowłoki są ignorowane, gdy wiersz -echo
polecenie - ma własny kod wyjścia (zwykle 0).if ! $(exit 1) ; then echo $?; fi
, rozumiem0
. Nie jestem pewien,if
jak to zrobić, jeśli chcesz zachować tę wartość wyjściową.if ! output=$(inner); then exit $?; fi
zakończy działanie z kodem powrotu 0, ponieważ$?
poda kod powrotu!
zamiast kodu powrotu zinner
. Możesz uzyskać pożądane zachowanie,if output=$(inner); then : ; else exit $?; fi
ale to oczywiście bardziej szczegółoweZobacz BashFAQ / 002 :
Specjalny przypadek
Uwaga na temat trudnego przypadku ze zmiennymi lokalnymi funkcji, porównaj następujący kod:
Dostaniemy:
Dlaczego?
Gdy dane wyjściowe podpowłoki są używane do inicjalizacji
local
zmiennej, stanem wyjścia nie jest już podpowłoka, ale polecenie , które najprawdopodobniej będzie .local
0
Zobacz także https://stackoverflow.com/a/4421282/537554
źródło
Dodanie
echo
podpowłoki nie jest samodzielne (nie jest osobno sprawdzane) i nie jest przerywane. Przypisanie omija ten problem.Możesz to również zrobić i przekierować dane wyjściowe do pliku, aby później je przetworzyć.
źródło