Прямой вывод xtrace в другое место, кроме stderr в zsh

Вы можете узнать текущий euid процесса, посмотрев /proc/PID/status. Если euid или uid равны 0, проверьте audit.log в selinix и списки POSIX ACL в каталоге через getfacl

5
03.05.2019, 23:37
2 ответа

Начиная с zsh 5.7 ответ отрицательный. Вывод трассировки всегда идет в stderr.

Источник :чтение источника. Вывод трассировки записывается в файл xtrerr, что выглядит многообещающе, но единственными назначениями для xtrerrявляются stderr, его копия или 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
5
27.01.2020, 20:39

Я использую очень простой обходной путь, который может быть полезен, если вы хотите отладить только определенную функцию, хотя ту же идею можно применить для полной трассировки с помощью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

И создайте дочернюю оболочку с помощью TRACE_ZSH=1 zsh -l 2> debug.err.txt.

2
27.01.2020, 20:39

Теги

Похожие вопросы