사용자 정의 BASH_XTRACEFD를 사용하여 대화 상자를 실행하면 트랩이 무시됩니다.

사용자 정의 BASH_XTRACEFD를 사용하여 대화 상자를 실행하면 트랩이 무시됩니다.

다음 스크립트가 있습니다

#!/bin/bash

exec 5> >(logger -t $0)
BASH_XTRACEFD="5"
set -x

trap _reboot INT

DIALOG_TITLE="This is fancy dialog title"

_reboot() {
        echo Exiting
        exit
}

dialog --title "${DIALOG_TITLE}" --yesno "Welcome to Dialog" 0 0

그러나 CTRL+C를 수행하면 아무것도 인쇄되지 않고 스크립트가 종료됩니다. 그 중 하나를 제거하면 set -x제대로 BASH_XTRACEFD="5"작동하고 트랩을 포착하여 _reboot 함수를 실행합니다. 그러나 디버깅 목적으로 필요한 두 가지를 모두 유지하면 트랩은 모든 의미를 잃습니다.

종료 코드는 141인데, CTRL+C를 사용하여 종료할 때 흥미롭습니다. 스크립트를 실행하면 자연스럽게 0으로 종료되지만, set -x또는 중 하나를 제거 BASH_XTRACEFD="5"하면 CTRL+C55로 종료됩니다.

어떤 이유로 이 문제는 대화 상자가 화면에 나타날 때만 발생합니다. 예를 들어 내가 그렇게 하면

while true; do
  sleep 5
done

그런 다음 트랩을 사용하여 종료 CTRL+C가 실행됩니다.

이 문제를 해결하려면 도움이 필요합니다.

편집: bash 버전은 Alpine 3.16에서 실행되는 5.1.16이라는 점을 언급할 가치가 있을 것입니다.

답변1

대화 상자는 맨페이지 섹션에 설명된 SIGINT대로 를 캡처하는 ncurses를 사용합니다.initscr신호 프로세서:

SIGINT
핸들러는 종료 시 화면 정리를 시도합니다. 일반적으로 예상대로 작동하지만 다음과 같은 제한 사항이 있습니다.

  • SCREEN 목록을 탐색하는 것은 모든 목록 관리가 신호 차단 없이 수행되기 때문에 안전하지 않습니다.
  • REENTRANT가 켜져 있는 시스템에서는 set_term에서 사용하는 함수가 교착 상태에 빠지거나 오류가 발생할 수 있습니다.
  • endwin은 stdio나 다른 라이브러리 함수를 사용하는 다른 함수를 호출하는데 이는 확실히 안전하지 않습니다.

Bash는 하위 프로세스가 먼저 신호를 포착하지 못하는 경우에만 신호를 "인식"합니다.

관련 정보