함수 로컬 `set -e`

함수 로컬 `set -e`

그러한 기능이 있습니까? 아니면 쉽게 에뮬레이트할 수 있습니까? 호출이 발생 해야 하는 return위치를 제외하고는 동일한 동작을 원합니다 .set -eexit

답변1

하위 쉘이 유용할 수 있습니다.

func() {(set -e
        echo a
        ehco b
        echo c
)}

func
func
func

이 스크립트는 다음을 생성합니다.

a
script.sh: line 3: ehco: command not found
a
script.sh: line 3: ehco: command not found
a
script.sh: line 3: ehco: command not found

아니면 관심이 있을 수도 있어요Bash에서 try/catch 구현.

답변2

ERR명령이 0이 아닌 상태를 반환할 때마다 실행될 트랩을 설정할 수 있습니다 .

Bash에서는 트랩이 함수에 로컬이 아니기 때문에 이는 좀 더 복잡합니다. 기본적으로 트랩은 이를 변경하기 위한 하위 쉘이나 하위 함수 호출에 의해 상속되지 않습니다 set -E. 다음은 몇 가지 데모 코드입니다.

#!/bin/bash

subroutine () {
  false
  echo "Subroutine continued after status $?"
}

trapper () {
  local i ret
  trap 'ret=$?
        echo "Command $BASH_COMMAND returned status $ret"
        for ((i=0; i<$((${#FUNCNAME[@]}-1)); i++)) do
          echo "  from ${FUNCNAME[$i]} at ${BASH_SOURCE[$((i+1))]} line ${BASH_LINENO[$((i+1))]}"
        done
        return $ret' ERR
  trap 'ret=$?; trap - ERR RETURN; return $ret' RETURN
  echo ok
  subroutine
  echo "By default, the ERR trap is not inherited"
  false
  echo "You won't see this"
}

main () {
  trapper
  echo "trapper returned status $?"
  false
  echo "still there"
}

main

TRAPZERRzsh에서는 (호환성을 위해) 또는 (라는 이름의 신호가 있는 시스템에서 - 아무것도 모릅니다) 에 대한 트랩을 설정하는 대신 기능을 정의할 수 있습니다 . 그러나 (오류 메시지를 인쇄하는 대신) 즉시 반환을 원하는 경우 더 쉽습니다. 옵션을 설정하기만 하면 됩니다. 옵션은 기본적으로 전역적입니다. 호출 함수에 대해 로컬이 되도록 옵션을 설정합니다(함수가 반환될 때 설정된 경우 함수 호출 시 옵션을 복원함). 기본적으로 트랩도 전역적입니다. 옵션과 트랩은 함수 호출 전체에서 상속됩니다.ERRZERRSIGERRerr_returnlocal_optionslocal_options

myfunction () {
  setopt local_options err_return
  false
  echo not executed
}

답변3

의 경우 자체 구문을 ksh93사용하여 함수( )를 정의하면 옵션과 트랩에 로컬 범위가 있습니다. 따라서 다음과 같이 할 수 있습니다.kshfunction f {...;}

function f {
  trap 'return 99' ERR
  set -e
  echo foo
  false
  echo never output
}
f
echo "f exited with status $?"

이것은 만든다:

foo
f exited with status 99

관련 정보