함수 출력이 변수에 할당되면 스크립트가 종료되지 않습니다.

함수 출력이 변수에 할당되면 스크립트가 종료되지 않습니다.

아래 샘플 스크립트에 대한 몇 가지 질문이 있습니다.

함수를 호출 _foo하고 그 출력을 변수로 캡처하고 싶지만 반환 상태( OR $bar이 아닐 수 있음 )를 사용하거나 실패 시(0이 아닌 경우) 스크립트를 중지하려고 합니다.01exit

  • 이렇게 호출하면 in 함수가 작동하지 않는 이유는 무엇입니까 exit? _foo( if ! bar="$(_foo)"). "normal"이 호출되면 작동합니다.
    • exitif 문을 다음과 같이 변경하면(그러나 출력이 손실됨) 스크립트가 중지됩니다.if ! _foo ; then
    • 이는 스크립트 exit처럼 동작 하며 중지하지 않습니다.returnif ! bar="$(_foo)" ; then
    • 할당과 종료 없이 함수를 호출하는 것만으로도 괜찮지만, 이렇게 호출하는 것은 var="$(func)"아닙니다.
  • _foo함수에서 into의 출력을 캡처 $bar하고 반환 상태를 사용하는 더 좋은 방법이 있습니까( 또는 문 0이외의 다른 경우 ?)1case

어떻게든 사용해야 할 것 같은 느낌이 듭니다 trap.


간단한 예는 다음과 같습니다.

#!/usr/bin/env bash

set -e
set -u
set -o pipefail

_foo() {
    local _retval
    echo "baz" && false
    _retval=$?
    exit ${_retval}
}

echo "start"

if ! bar="$(_foo)" ; then
    echo "foo failed"
else
    echo "foo passed"
fi

echo "${bar}"
echo "end"

출력은 다음과 같습니다.

$ ./foo.sh 
start
foo failed
baz
end

다음은 몇 가지 추가 예입니다.

그러면 종료됩니다:

#!/usr/bin/env bash

set -e
set -u
set -o pipefail

func() {
    echo "func"
    exit
}

var=''
func
echo "var is ${var}"
echo "did not exit"

종료되지 않습니다.

#!/usr/bin/env bash

set -e
set -u
set -o pipefail

func() {
    echo "func"
    exit
}

var=''
var="$(func)"
echo "var is ${var}"
echo "did not exit"

답변1

exit함수뿐만 아니라 함수 내에서 전체 스크립트를 종료합니다(하위 쉘에도 불구하고). 동화:

#!/bin/bash
f() {
   exit 3
}
f
exit 0

위 스크립트는 종료 코드 3으로 종료됩니다.

#!/bin/bash
f() {
   exit 3
}
(f)
exit 0

종료 코드 0으로 종료됩니다.

$(command)사용 중인 구문은 하위 쉘 내에서 실행되며 command하위 exit쉘이 실행 중인 수준에서만 벗어날 수 있습니다.이내에.

서브셸에서 실행 중인 항목의 종료 코드와 출력을 캡처하려는 경우 서브셸이 시작된 환경에서 계속 사용할 수 있습니다.

#!/bin/bash
subshelloutput="$( echo "output"; exit 3 )"
returnval=$?  # captures subshell's exit code
: more stuff follows

답변2

다른 방법으로도 할 수 있습니다.

_foo () 
{ 
    local _retval
    declare -n output="$1"     # $output is local (by default with declare in a func.)
                               ## and points to $1
    output="baz" && false
    _retval=$?
    echo ${_retval}            # change echo to exit
}

이제 _foo다음과 같이 호출하세요.

$ _foo bar
1
$ echo "$bar"
baz

함수 정의에서 로 변경하면 echo스크립트가 종료됩니다.exitexit

관련 정보