Есть ли что-то вроде BASH_COMMAND с расширенными переменными или BASH_ARGV с «выполняемой в данный момент командой»?
Я считаю, что краткий ответ - нет, к сожалению. Но в зависимости от вашего варианта использования есть несколько вариантов.
Самый простой подход - использовать set -x
для регистрации важных вызовов. Это, очевидно, работает, только если вы заранее знаете, какие вызовы вам нужны, но аналогичным образом записываете команды как выполненные. Вы можете использовать подоболочку, то есть ( set -x; my_command ... )
для регистрации просто рассматриваемой команды.
Если вы хотите войти в систему только ERR
, как вы делаете здесь, вы можете по крайней мере, проверьте BASH_ARGV
/ BASH_ARGC
(с extdebug
), чтобы увидеть функции и другие подпрограммы в стеке. Это не поддерживает произвольные команды, но поскольку оно содержит параметры , переданные в каждый кадр стека, все аргументы раскрываются.
Это предлагает потенциальный обходной путь: сделайте интересующую вас команду в функции! добавление false() { command false "$@"; }
в ваш скрипт должно дать вам необходимую информацию. Конечно, это немного утомительно, поэтому мы можем сделать обертку общего назначения для любых интересующих нас команд, если не возражаем против небольшого eval
-ing:)
function_wrapper() {
for cmd in "$@"; do
eval "${cmd}() { command ${cmd} \"$@\"; }"
done
}
function_wrapper true false ...
Мы могли бы украсить все встроенные оболочки так, как мы хотели:
while read -r _ cmd; do
eval "${cmd}() { command ${cmd} \"$@\"; }"
done < <(enable -a)
Будь это хорошая идея или нет, я ' оставлю до вас :)