1

Я пытаюсь восстановить командную строку 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 можно использовать для этого? Любые другие идеи приветствуются.

0