Eu estou tentando reconstruir uma linha de comando bash em seu todo, como em incluir um pipe; & amp; & amp; ou ";"
Eu estou usando a armadilha DEBUG no meu bash (s) para gerar um global command.log (como histórico, mas também para sistemas remotos). Eu tenho algo como:
preexec () { :; }
preexec_invoke_exec () {
[ -n "$COMP_LINE" ] && return # do nothing if completing
[ "$BASH_COMMAND" = "$PROMPT_COMMAND" ] && return # don't cause a preexec for $PROMPT_COMMAND
local this_command=$(echo "${USER}@${HOSTNAME}:${PWD}> $BASH_COMMAND" | ${HOME}/cmd_digest.sh);
preexec "$this_command"
}
trap 'preexec_invoke_exec' DEBUG
Eu encontrei este recortado via O bash tem um gancho que é executado antes de executar um comando?
Minha versão anterior usava o mais óbvio:
PROMPT_COMMAND='echo "${USER}@${HOSTNAME}:${PWD}> $(HISTTIMEFORMAT= history 1|cut -c8-)" | ${HOME}/cmd_digest.sh'
Problema aqui é comandos como ssh ou tela são registrados extremamente fora do tempo. Esse problema é corrigido pela interceptação DEBUG, que garante que este comando seja executado antes do próprio comando.
Mas agora tenho que lidar com as invocações do bash. Linhas de comando como:
echo foo | grep bar
estão ficando presos duas vezes, o que obviamente não pode ser evitado. No entanto, se eu pudesse reunir informações sobre o BASH_COMMAND, poderia reconstruir a linha de comando original emitida.
Então, qual variável env poderia ser usada para conseguir isso? Quaisquer outras idéias são muito bem vindas.