Я пытаюсь восстановить командную строку bash в целом, в том числе в трубе; && или же ";".
Я использую ловушку DEBUG на моем bash(s) для генерации глобального command.log (как история, но также и для удаленных систем). У меня есть что-то вроде:
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
Я обнаружил, что это снято с помощью. Есть ли в bash обработчик перед выполнением команды?
Моя предыдущая версия использовала более очевидные:
PROMPT_COMMAND='echo "${USER}@${HOSTNAME}:${PWD}> $(HISTTIMEFORMAT= history 1|cut -c8-)" | ${HOME}/cmd_digest.sh'
Проблема здесь заключается в том, что такие команды, как ssh или screen, регистрируются очень вовремя. Эта проблема исправлена ловушкой DEBUG, которая обеспечивает выполнение this_command перед самой командой.
Но теперь я имею дело с вызовами bash. Командные строки, такие как:
echo foo | grep bar
попадают в ловушку дважды, что, конечно, не может быть предотвращено. Однако, если бы я мог собрать информацию о BASH_COMMAND, я мог бы восстановить исходную командную строку.
Так какую переменную env можно использовать для этого? Любые другие идеи приветствуются.