set -x
set -o xtrace
zsh에서 ()의 추적 출력을 stderr 이외의 파일 설명자로 보낼 수 있습니까 ?
나는 동등한 것을 찾고 있습니다$BASH_XTRACEFD
또는 동일한 행동을 모방하는 방법입니다.
답변1
zsh 5.7부터 대답은 '아니오'입니다. 추적 출력은 항상 stderr로 전송됩니다.
출처: 출처를 읽어보세요. 추적 출력은 xtrerr
유망해 보이는 파일에 기록되지만 에 대한 유일한 할당은 xtrerr
to 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
.