Вы можете узнать текущий euid процесса, посмотрев /proc/PID/status
. Если euid или uid равны 0, проверьте audit.log
в selinix и списки POSIX ACL в каталоге через getfacl
Начиная с 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
Я использую очень простой обходной путь, который может быть полезен, если вы хотите отладить только определенную функцию, хотя ту же идею можно применить для полной трассировки с помощью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
.