[bash] Bash 함수에서 리턴과 종료의 차이점

종료 코드와 관련하여 Bash 함수에서 returnexit명령문 의 차이점은 무엇입니까 ?



답변

에서 man bashreturn [n];

함수가 실행을 중지하고 n으로 지정된 값을 호출자에게 반환합니다. n이 생략되면 리턴 상태는 함수 본문에서 마지막으로 실행 된 명령의 상태입니다.

…에 exit [n]:

쉘을 n 상태로 종료하십시오. n을 생략하면 종료 상태는 마지막으로 실행 된 명령의 종료 상태입니다. EXIT의 트랩은 쉘이 종료되기 전에 실행됩니다.

편집하다:

종료 코드와 관련하여 질문을 편집 한 결과 종료 코드와 관련 return이 없습니다. 종료 코드는 기능이 아닌 응용 프로그램 / 스크립트를 위한 것입니다 . 따라서 이와 관련하여 스크립트의 종료 코드를 설정하는 유일한 키워드 ( $?셸 변수를 사용하여 호출 프로그램이 포착 할 수있는 키워드 )는 exit입니다.

편집 2 :

마지막으로 언급 한 내용 exit은 몇 가지 의견을 제시합니다. 그것은 차별화하기로 결정했습니다 returnexit영업 이익의 이해, 그리고 사실에서 어떤 프로그램 / 쉘 스크립트의 특정 시점,exit 호출 프로세스 종료 코드와 스크립트를 종료하는 유일한 방법입니다.

그것은 설정 : 쉘에서 실행되는 모든 명령은 로컬 “종료 코드”를 생산하고 $?그 코드에 변수와 함께 사용할 수 있습니다 if, &&및 조건에 다른 사업자가 다른 명령을 실행합니다.

이 종료 코드 (및 $?변수 값 )는 각 명령 실행에 의해 재설정됩니다.

또한, 스크립트에 의해 실행 된 마지막 명령의 종료 코드는 호출 프로세스에서 볼 수 있듯이 스크립트 자체의 종료 코드로 사용됩니다.

마지막으로 함수는 호출 될 때 종료 코드와 관련하여 쉘 명령으로 작동합니다. 함수의 종료 코드 (함수 )는를 사용하여 설정됩니다 return. 따라서 return 0함수에서 실행될 때 함수 실행이 종료되고 종료 코드는 0입니다.


답변

return현재 함수가 범위를 벗어나는 반면 exit스크립트는 호출 된 지점에서 종료됩니다. 다음은이를 설명하는 데 도움이되는 샘플 프로그램입니다.

#!/bin/bash

retfunc()
{
    echo "this is retfunc()"
    return 1
}

exitfunc()
{
    echo "this is exitfunc()"
    exit 1
}

retfunc
echo "We are still here"
exitfunc
echo "We will never see this"

산출

$ ./test.sh
this is retfunc()
We are still here
this is exitfunc()


답변

나는 두 사람이 어떻게 사용되는지 설명하지 않기 때문에 누군가가 질문에 완전히 대답했다고 생각하지 않습니다. 알겠습니다. exit는 스크립트가 호출되는 모든 위치에서 스크립트를 종료하고 종료 또는 종료 0 또는 종료 7과 같은 상태를 스크립트에 할당 할 수 있다는 것을 알고 있습니다. 다른 스크립트 등에 의해 호출 된 경우 스크립트가 강제로 중지 된 방법을 판별하는 데 사용할 수 있습니다. 종료시 충분합니다.

호출시 return은 함수의 동작을 나타내도록 지정된 값 (일반적으로 1 또는 0)을 반환합니다. 예를 들면 다음과 같습니다.

    #!/bin/bash
    isdirectory() {
      if [ -d "$1" ]
      then
        return 0
      else
        return 1
      fi
    echo "you will not see anything after the return like this text"
    }

다음과 같이 확인하십시오.

    if isdirectory $1; then echo "is directory"; else echo "not a directory"; fi

또는 이와 같이 :

    isdirectory || echo "not a directory"

이 예제에서는 테스트를 사용하여 디렉토리를 찾았는지 여부를 표시 할 수 있습니다. 리턴 후에는 함수에서 실행되지 않습니다. 쉘에서 0은 true이지만 다른 prog lang과는 달리 false는 1입니다.

함수에 대한 자세한 정보 :
http://www.linuxjournal.com/content/return-values-bash-functions

참고 : isdirectory 기능은 설명을위한 것입니다. 실제 스크립트에서 이러한 옵션을 수행하는 방법이 아닙니다.


답변

함수는 스크립트 내부에 있으며 일반적으로 return 문을 사용하여 호출 한 시점에서 반환합니다. 외부 스크립트를 호출하는 것은 완전히 다른 문제이며 스크립트는 일반적으로 exit 문으로 종료됩니다.

“종료 코드와 관련하여 BASH 함수의 return 및 exit 문 간의 차이”는 거의 없습니다. 둘 다 자체가 아닌 상태를 반환합니다 . 상태 0은 성공을 나타내고 다른 상태 (1-255)는 실패를 나타냅니다. return 문은 스크립트가 호출 된 곳에서 스크립트로 돌아가고 exit 문은 스크립트가있는 곳에서 전체 스크립트를 종료합니다.

return 0  # returns to where the function was called.  $? contains 0 (success).

return 1  # returns to where the function was called.  $? contains 1 (failure).

exit 0  # exits the script completely.  $? contains 0 (success).

exit 1  # exits the script completely.  $? contains 1 (failure).

함수가 단순히 return 문없이 끝나는 경우 마지막으로 실행 된 명령의 상태가 상태 코드로 반환되며 $? ).

return and exit는 0에서 255 사이의 상태 코드를 반환합니다. $? 합니다. 상태 코드에 다른 것을 넣을 수 없습니다 (예 : “cat”반환). 이거 작동 안 할거야. 그러나 스크립트는 상태 코드를 사용하여 실패에 대한 255 가지 다른 이유를 전달할 수 있습니다.

호출 스크립트에 포함 된 변수를 설정하거나 함수에서 결과를 반향하고 호출 스크립트에서 명령 대체를 사용할 수 있습니다. 그러나 리턴 및 종료의 목적은 C와 같은 프로그래밍 언어에서 예상되는 값 또는 계산 결과가 아닌 상태 코드를 전달하는 것입니다.


답변

때때로, 당신은 사용하여 스크립트를 실행 .하거나 source.

. a.sh

당신이 포함하는 경우 exit의를 a.sh, 그냥 스크립트를 종료하지만, 쉘 세션을 종료하지 않습니다.

당신이 포함 된 경우 return에서 a.sh, 단순히 스크립트 처리를 중지합니다.


답변

간단한 말로 (주로 코딩의 초보자를 위해), 우리는 말할 수 있습니다.

`return` : exits the function,
`exit()` : exits the program(called as process while running)

또한 당신이 관찰한다면, 이것은 매우 기본이지만 …

`return` : is the keyword
`exit()` : is the function


답변

  • exit현재 프로세스를 종료 ; 종료 코드 유무에 관계없이이를 프로그램 기능 이상의 시스템으로 간주하십시오. 소싱 할 때 exit셸이 종료되지만 실행하면 exit스크립트 만 종료 됩니다.

  • return함수에서 호출 후 리턴 코드 유무에 관계없이 명령으로 돌아갑니다. return선택 사항이며 함수 끝에서 암시 적입니다. return함수 안에서만 사용할 수 있습니다.

소스를 제공하는 동안 exit쉘을 죽이지 않고 함수 내에서 스크립트를 사용하는 것은 쉽지 않습니다 . 예를 들어 ‘테스트’스크립트에서 더 낫습니다.

#!/bin/bash
function die(){
   echo ${1:=Something terrible wrong happen}
   #... clean your trash
   exit 1
}

[ -f /whatever/ ] || die "whatever is not available"
# now we can proceed
echo "continue"

다음을 수행

user$ ./test
Whatever is not available
user$

test 쉘이 닫힙니다.

user$ . ./test
Whatever is not available

test 완료되고 메시지가 표시됩니다.

상기 용액의 잠재적 절차를 둘러싸이고 ()

#!/bin/bash
function die(){
   echo $(1:=Something terrible wrong happen)
   #... clean your trash
   exit 1
}

( # added        
    [ -f /whatever/ ] || die "whatever is not available"
    # now we can proceed
    echo "continue"
) # added

이제 두 경우 모두 test종료됩니다.