zsh의 stderr을 제외한 다른 곳에서 직접 xtrace 출력

zsh의 stderr을 제외한 다른 곳에서 직접 xtrace 출력

set -xset -o xtracezsh에서 ()의 추적 출력을 stderr 이외의 파일 설명자로 보낼 수 있습니까 ?

나는 동등한 것을 찾고 있습니다$BASH_XTRACEFD또는 동일한 행동을 모방하는 방법입니다.

답변1

zsh 5.7부터 대답은 '아니오'입니다. 추적 출력은 항상 stderr로 전송됩니다.

출처: 출처를 읽어보세요. 추적 출력은 xtrerr유망해 보이는 파일에 기록되지만 에 대한 유일한 할당은 xtrerrto stderr, 해당 복사본 또는 to 입니다 NULL.

동적으로 로드 가능한 모듈 설정을 작성하는 것이 가능해야 xtrerr하지만 zsh 소스 트리 외부에 모듈을 작성하는 것은 쉽지 않습니다.

한 가지 가능한 해결 방법은 다음을 xtrace사용하는 것 입니다.DEBUG . 대부분의 경우 이는 동일한 기본 정보를 제공하지만 xtrace완벽하게 시뮬레이션하기 어렵거나 불가능한 특수한 경우가 많이 있을 것이라고 확신합니다 . 한 가지 차이점은 옵션 상속 xtrace과 트랩 상속이 기능, 서브쉘 등과 관련된 경우에 따라 다른 규칙을 따른다는 것입니다. emulate개념의 증거:

trap 'print -r -- "+$0:$LINENO>$ZSH_DEBUG_CMD" >>trace_file' DEBUG

아니면 좀 더 복잡할 수도 있습니다(테스트되지 않음).

zmodload zsh/system
sysopen -a -o create -u xtrace_fd trace_file
trap 'syswrite -o $xtrace_fd "+$0:$LINENO>$ZSH_DEBUG_CMD"' DEBUG

답변2

전체 추적에도 동일한 아이디어를 적용할 수 있지만 특정 기능만 디버깅하려는 경우 유용할 수 있는 매우 간단한 해결 방법을 사용하고 있습니다 set -x.

예를 들어 특정 기능을 디버깅해야 하는 경우 다음을 설정한 상태에서 myfunc하위 셸을 엽니다 .TRACE_FUNC=myfunc zsh -l 2> debug.err.txt~/.zshrc

if [ -n "${TRACE_FUNC}" ]; then
    functions -t "$TRACE_FUNC"
fi

~/.zshrc다음을 입력하여 동일한 아이디어를 적용 할 수 있습니다 .

if [ -n "${TRACE_ZSH}" ]; then
    set -x
fi

그리고 generate subshell을 사용하세요 TRACE_ZSH=1 zsh -l 2> debug.err.txt.

관련 정보