'${FUNCNAME[@]}'의 SIGINT가 지워지지 않았습니다.

'${FUNCNAME[@]}'의 SIGINT가 지워지지 않았습니다.

아래와 같이 키보드 입력 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.

관련 정보