В ударе я могу принять меры, чтобы функция была выполнена прежде, чем выполнить команду?
Существует $PROMPT_COMMAND
, который выполняется прежде, чем показать подсказку, т.е. сразу после выполнения команды.
Bash $PROMPT_COMMAND
походит на zsh's precmd
функция; таким образом, то, что я ищу, является ударом, эквивалентным zsh's preexec
.
Примеры приложений: установите свой терминальный заголовок на выполняемую команду; автоматически добавьте time
перед каждой командой.
Не исходно, но это может быть изрублено с помощью 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
Можно использовать trap
команда (от help trap
):
Если SIGNAL_SPEC является ОТЛАДКОЙ, АРГУМЕНТ выполняется перед каждой простой командой.
Например, для изменения терминального заголовка динамично можно использовать:
trap 'echo -e "\e]0;$BASH_COMMAND\007"' DEBUG
Из этого источника.