Удар имеет рычаг, который выполняется прежде, чем выполнить команду?

В ударе я могу принять меры, чтобы функция была выполнена прежде, чем выполнить команду?

Существует $PROMPT_COMMAND, который выполняется прежде, чем показать подсказку, т.е. сразу после выполнения команды.

Bash $PROMPT_COMMAND походит на zsh's precmd функция; таким образом, то, что я ищу, является ударом, эквивалентным zsh's preexec.

Примеры приложений: установите свой терминальный заголовок на выполняемую команду; автоматически добавьте time перед каждой командой.

113
задан 14.08.2010, 14:17

2 ответа

Не исходно, но это может быть изрублено с помощью DEBUG прерывание. Это кодовые наборы preexec и precmd функционирует подобный zsh. Командная строка передается как отдельный аргумент preexec.

Вот упрощенная версия кода для установки a precmd функция, которая выполняется прежде, чем выполнить каждую команду.

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=`HISTTIMEFORMAT= history 1 | sed -e "s/^[ ]*[0-9]*[ ]*//"`;
    preexec "$this_command"
}
trap 'preexec_invoke_exec' DEBUG

Этот прием происходит из-за Глифа Lefkowitz; благодаря bcat для определения местоположения исходного автора.

Править. Обновленная версия взлома Глифа может быть найдена здесь: https://github.com/rcaloras/bash-preexec

93
ответ дан 07.12.2019, 07:51

Можно использовать trap команда (от help trap):

Если SIGNAL_SPEC является ОТЛАДКОЙ, АРГУМЕНТ выполняется перед каждой простой командой.

Например, для изменения терминального заголовка динамично можно использовать:

trap 'echo -e "\e]0;$BASH_COMMAND\007"' DEBUG

Из этого источника.

20
ответ дан 07.12.2019, 07:51

Теги

Похожие вопросы