대시: 트랩(인수 없이 호출됨)의 출력을 캡처하는 방법은 무엇입니까?

대시: 트랩(인수 없이 호출됨)의 출력을 캡처하는 방법은 무엇입니까?

trap부분의대시 맨페이지성명은 다음과 같습니다 :

인수를 취하지 않으면 신호 목록과 관련 작업이 특정 형식으로 표준 출력에 기록됩니다.동일한 캡처 결과를 얻기 위한 셸 입력으로 적합.

놀라운! 나는 trap이 출력을 명령으로 셸에 다시 공급하여 덮어쓴 이전 신호 처리기를 복원하는 쉬운 방법을 찾은 것 같습니다 .

trap "echo 'good'" EXIT

# save signal handlers to $traps
traps="$(trap)"

# override EXIT handler
trap "echo 'bad'" EXIT

# reinstate original handlers
eval "$traps"

원하는 출력:good

실제 출력:bad

이는 비어 있기 때문에 완전히 논리적이며 $traps맨페이지와도 일치합니다.

쉘이 하위 쉘에서 분기되면 캡처된(무시되지는 않음) 신호를 기본 작업으로 재설정합니다.

(명령 대체는 $(trap)서브쉘을 분기하므로 trap신호 처리기에 대해 알지 못합니다.)


모든 것이 제대로 작동하는 것 같습니다. 그런데 trap목록 기능을 어떻게 활용하나요 ?

답변1

임시 파일로 리디렉션할 수 있습니다.

file=$(mktemp) || exit
{
  rm -f -- "$file"
  trap
  traps=$(cat)
} > "$file" < "$file"

이와 관련하여 POSIX가 아닙니다 dash.trapPOSIX에는 다음이 필요합니다.저것:

var=$(trap)

트랩이 서브쉘에서 재설정되지 않는 특별한 경우로 간주됩니다.

zsh그리고 mksh이런 문제도 있습니다. 그러나 zsh다음을 수행할 수 있습니다.

trap | IFS= read -rd '' traps

관련 정보