Como uma aproximação, você poderia fazer:
trap '{ type -p -- "${BASH_COMMAND%% *}" >&3; } 3>&2 2> /dev/null' DEBUG
set -o functrace -o xtrace
O trap DEBUG
é executado antes de cada comando. Durante a execução dessa armadilha, $BASH_COMMAND
é definido para o comando atual. Isso inclui chamadas de função, builtins, designações ... Chamamos type -p
na primeira parte até o primeiro caractere de espaço com stdout de type
retdirecionado para stderr do shell (via fd 3, de forma que o xtrace
output é redirecionado para /dev/null
).
Isso é uma aproximação, pois não funcionará em casos como "cmd" foo
ou $CMD foo
. Como por xtrace
, cuidado com os redirecionamentos do stderr.
Sem modificar o script:
BASH_ENV=<(cat <<'EOF'
trap '{ type -p -- "${BASH_COMMAND%% *}" >&3; } 3>&2 2> /dev/null' DEBUG
EOF) bash -o functrace -x your-script
Ou para tê-lo no prompt PS4
:
BASH_ENV=<(cat <<'EOF'
{ trap '{ cmdpath=$(type -p -- "${BASH_COMMAND%% *}")
} 2> /dev/null' DEBUG;} 2> /dev/null
EOF) PS4='+[$cmdpath] ' bash -o functrace -x your-script
ou para evitar o fork:
BASH_ENV=<(cat <<'EOF'
{ trap '{ hash -- "${BASH_COMMAND%% *}";} 2> /dev/null' DEBUG;}2>/dev/null
EOF) PS4='+[${BASH_CMDS[${BASH_COMMAND%% *}]}] ' bash -o functrace -x your-script