![함수 로컬 `set -e`](https://linux55.com/image/66411/%ED%95%A8%EC%88%98%20%EB%A1%9C%EC%BB%AC%20%60set%20-e%60.png)
그러한 기능이 있습니까? 아니면 쉽게 에뮬레이트할 수 있습니까? 호출이 발생 해야 하는 return
위치를 제외하고는 동일한 동작을 원합니다 .set -e
exit
답변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
TRAPZERR
zsh에서는 (호환성을 위해) 또는 (라는 이름의 신호가 있는 시스템에서 - 아무것도 모릅니다) 에 대한 트랩을 설정하는 대신 기능을 정의할 수 있습니다 . 그러나 (오류 메시지를 인쇄하는 대신) 즉시 반환을 원하는 경우 더 쉽습니다. 옵션을 설정하기만 하면 됩니다. 옵션은 기본적으로 전역적입니다. 호출 함수에 대해 로컬이 되도록 옵션을 설정합니다(함수가 반환될 때 설정된 경우 함수 호출 시 옵션을 복원함). 기본적으로 트랩도 전역적입니다. 옵션과 트랩은 함수 호출 전체에서 상속됩니다.ERR
ZERR
SIGERR
err_return
local_options
local_options
myfunction () {
setopt local_options err_return
false
echo not executed
}
답변3
의 경우 자체 구문을 ksh93
사용하여 함수( )를 정의하면 옵션과 트랩에 로컬 범위가 있습니다. 따라서 다음과 같이 할 수 있습니다.ksh
function 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