Bash 함수의 암시적 반환?

Bash 함수의 암시적 반환?

다음과 같은 bash 기능이 있다고 가정해 보겠습니다.

gmx(){
  echo "foo";
}

함수가 명령의 종료 값을 암시적으로 반환합니까 echo, 아니면 return을 사용해야 합니까?

gmx(){
  echo "foo";
  return $?
}

나는 bash가 작동하는 방식이 bash 함수의 최종 명령의 종료 상태가 "return" 상태라고 가정하고 있지만 100% 확신할 수는 없습니다.

답변1

return어떤 것을 만들어분명히쉘 함수 또는 "도트 스크립트"(소스 스크립트)에서 반환됩니다. 실행되지 않으면 return쉘 함수나 도트 스크립트의 끝에서 암시적으로 반환됩니다.

매개변수 없이 실행 하면 return가장 최근에 실행한 명령의 종료 상태를 반환하는 것과 같습니다.

이것이 return모든 POSIX 쉘에서 작동하는 방식입니다.

예를 들어,

gmx () {
  echo 'foo'
  return "$?"
}

따라서 다음과 같습니다.

gmx () {
  echo 'foo'
  return
}

이는 다음과 같습니다.

gmx () {
  echo 'foo'
}

일반적으로 말해서 사용할 필요가 거의 없습니다 $?. 실제로 나중에 사용하기 위해 저장해야 하는 경우에만 필요합니다. 예를 들어 해당 값을 여러 번 조사해야 하는 경우(이 경우 해당 값을 변수에 할당하고 일련의 테스트를 수행합니다).

답변2

bash(1)매뉴얼 페이지 에서 :

실행될 때 함수의 종료 상태는 함수 본문에서 실행된 마지막 명령의 종료 상태입니다.

답변3

이미 제공된 답변에 몇 가지 참고 사항을 추가하겠습니다.

  • 쉘에 매우 특별한 의미가 있지만 return구문 관점에서 볼 때 이는 쉘 내장 명령이며 return 문은 다른 간단한 명령처럼 구문 분석됩니다. 따라서 이는 다른 명령의 인수와 마찬가지로 $?인용되지 않은 경우 Split+glob의 영향을 받는다는 것을 의미합니다.

    $?따라서 이를 방지하려면 인용해야 합니다 .

    return "$?"
    
  • return일반적으로 어떤 옵션도 허용하지 않습니다( ksh93's는 일반적인 --help, --man, --author...을 허용하지만). 예상되는 유일한 인수(선택 사항)는 반환 코드입니다. 허용되는 반환 코드의 범위는 셸마다 다르며 $?0..255 이외의 값이 올바르게 반영되는지 여부도 마찬가지입니다. 바라보다프로세스 종료 시 기본 종료 코드는 무엇입니까?세부.

    대부분의 쉘은 음수를 허용합니다. (결국 _exit()/ exitgroup()시스템 호출에 전달된 인수는 int이므로 값에는 최소한 -2 31 ~ 2 31 -1이 포함되므로 쉘이 동일한 범위의 함수만 허용하는 것이 합리적입니다. ).

    대부분의 쉘은 waitpid()및 공동을 사용합니다. 종료 상태를 검색하기 위한 API이지만 이 경우 0에서 255 사이의 숫자로 잘립니다.저장됨존재하다 $?. 함수 호출에는 프로세스 생성 및 종료 상태 검색이 포함되지 않지만 waitpid()모든 것이 동일한 프로세스 내에서 수행되므로 많은 쉘 waitpid()도 함수를 호출할 때 이 동작을 모방합니다. 즉 return, 음수 값으로 호출 하더라도 $?양수는 포함된다는 의미입니다.

    이제 음수(ksh88, ksh93, bash, zsh, pdksh 및 mksh, yash를 제외한 파생물)를 허용하는 쉘에서 일부(pdksh 및 yash)는 이를 3 , , 유효하지 않은 옵션 으로 return작성해야 합니다 .return -- -123-123-1-2-3

    pdksh 및 그 파생물(예: OpenBSD sh또는 pdksh posh)은 음수를 유지하므로 음수가 포함되면 $?실행이 실패함을 의미합니다 return "$?"(마지막 명령 실행이 음수를 반환하는 함수일 때 발생함).$?

    그래서 return -- "$?"그 껍질에 더 좋습니다. 그러나 대부분의 쉘은 이 구문을 지원하지만 POSIX가 아니며 실제로 mkshash 파생물에서는 지원되지 않습니다.

    즉, 요약하자면 pdksh 기반 쉘에서는 함수 인수에 음수를 사용할 수 있지만 그렇게 하면 return "$@"작동하지 않습니다. 작동하는 다른 쉘에서는 return "$@"음수(또는 0..255 이외의 숫자)를 인수로 사용하지 않아야 합니다 return.

  • 내가 아는 모든 쉘에서 return함수 내에서 실행 중인 서브쉘 내에서 호출하면 서브쉘이 종료되지만(제공된 종료 상태가 있는 경우 또는 마지막 명령 실행의 종료 상태로) 그렇지 않으면 그렇지 않습니다. 함수(POSIX가 그러한 보장을 제공하는지 확실하지 않습니다. 일부 사람들은 exit함수 내의 하위 쉘을 종료하는 데 사용해야 한다고 생각합니다). 예를 들어

    f() {
      (return 3)
      echo "still inside f. Exit status: $?"
    }
    f
    echo "f exit status: $?"
    

    다음을 출력합니다:

    still inside f. Exit status: 3
    f exit status: 0
    

관련 정보