아래와 같이 키보드 입력 Ctrl+ 인터럽트를 통해 다음 스크립트를 사용합니다 .C
$ function a() { echo "Performing"; sleep 10; echo "Performed"; }
$ a
Performing
^C
$ echo "${FUNCNAME[@]}"
a source
while 함수를 여러 번 반복하면 SIGINT
다음과 같은 시나리오가 생성됩니다.a
...
$ a
Performing
^C
$ a
Performing
^C
$ echo "${FUNCNAME[@]}"
a a a a a a a a a source
이 문제를 설명하기 위해 다음과 같이 정의된 함수를 b
제공하는 다른 함수를 사용해 보겠습니다 .message_error
$ function message_error() {
> local MESSAGE="$1"
>
> # FUNCNAME[1], as [0] is `message_error`, gets the calling function
> echo "[[ ERROR ]] ${FUNCNAME[1]}: $MESSAGE"
> echo "Rest of the stack: ${FUNCNAME[@]}"
>}
$ function b() { message_error "Oh no"; }
$ b
[[ ERROR ]] b: Oh no
Rest of the stack: message_error b a a a a a a a a a source
source
에서 함수가 호출되더라도 a
호출 함수로 표시됩니다. 보시다시피 이러한 a
기능은 모두 종료되었습니다. 그러나 여전히 FUNCNAME 배열에는 남아 있습니다.
왜 이런거야? 삭제 실패 후 SIGINT를 삭제하는 방법은 무엇입니까? ~/.bash_functions
모든 함수는 여러 공통 함수에서 파생되며, 해당 함수를 얻으면 SIGINT를 해석하는 방식에 영향을 미칩니다 .
답변1
왜냐하면 FUNCNAME
그것은읽기 전용항목을 삭제할 수 없는 배열입니다. 이는 작동하는 것처럼 보이지만 특수한 FUNCNAME 동작 unset FUNCNAME
도 중단시킵니다 .bash
FUNCNAME
다음 방법을 사용하여 스팸을 방지할 수 있습니다 trap
.
$ trap : SIGINT
$ function a() { echo "Performing"; sleep 10; echo "Performed"; }
$ a
Performing
^C
$ echo %"${FUNCNAME[@]}"%
%%
위의 예방 조치를 비활성화하려면 다음을 수행하십시오 trap - SIGINT
.