В bash могу ли я организовать выполнение функции непосредственно перед выполнением команды?
Существует $PROMPT_COMMAND
, который выполняется перед отображением приглашения, т. Е. Сразу после запуска команды.
Bash $PROMPT_COMMAND
аналогичен precmd
функции Zsh ; так что я ищу bash, эквивалентный Zsh preexec
.
Примеры приложений: установите заголовок терминала для выполняемой команды; автоматически добавлять time
перед каждой командой.
command-line
bash
hook
Жиль
источник
источник
PS0
переменная, которая действует аналогично,PS1
но используется после чтения команды, но перед ее выполнением. См. Gnu.org/software/bash/manual/bashref.html#Bash-VariablesОтветы:
Не изначально, но его можно взломать с помощью
DEBUG
ловушки. Этот код настраиваетсяpreexec
иprecmd
функционирует подобно zsh. Командная строка передается как один аргументpreexec
.Вот упрощенная версия кода для настройки
precmd
функции, которая выполняется перед выполнением каждой команды.Этот трюк из-за Глифа Лефковица ; спасибо bcat за поиск оригинального автора.
Редактировать. Обновленную версию взлома Glyph можно найти здесь: https://github.com/rcaloras/bash-preexec
источник
"$BASH_COMMAND" = "$PROMPT_COMMAND"
Сравнение не работает для меня i.imgur.com/blneCdQ.pngtime for i in {1..10}; do true; done
обычно занимает 0,040 секунды и от 1,400 до 1,600 секунд после активации ловушки DEBUG. Это приводит к тому, что команда trap выполняется дважды за цикл - и на Cygwin разветвление, необходимое для выполнения sed, непомерно медленно - примерно 0,030 секунды для разветвления в одиночку (разница в скорости междуecho
встроенным и/bin/echo
). Что-то, чтобы иметь в виду, может быть.PROMPT_COMMAND
переменной (например , ограниченная;
), вам может понадобиться использовать сопоставление с образцом во второй строкеpreexec_invoke_exec
функции, так же , как это:[[ "$PROMPT_COMMAND" =~ "$BASH_COMMAND" ]]
. Это потому, чтоBASH_COMMAND
представляет каждую из команд в отдельности.Вы можете использовать
trap
команду (изhelp trap
):Например, для динамического изменения названия терминала вы можете использовать:
Из этого источника.
источник
help trap
говорится: «Если SIGNAL_SPEC - DEBUG, ARG выполняется после каждой простой команды» [выделено мной].trap '[ -n "$COMP_LINE" ] && [ "$BASH_COMMAND" != "$PROMPT_COMMAND" ] && date "+%X";echo -e "\e]0;$BASH_COMMAND\007"' DEBUG
. Это помещает команду в заголовок, а также печатает текущее время перед каждой командой, но не выполняет ее при выполнении$PROMPT_COMMAND
.[ -z "$COMP_LINE" ]
.Это не функция оболочки, которая выполняется, но я
$PS0
добавил строку приглашения, которая отображается перед выполнением каждой команды. Подробности здесь: http://stromberg.dnsalias.org/~strombrg/PS0-prompt/$PS0
включен вbash
4.4, хотя большинству Linux потребуется некоторое время, чтобы включить 4.4 - хотя вы можете собрать 4.4 самостоятельно, если хотите; в этом случае, вы, вероятно, должны положить его/usr/local
, добавить/etc/shells
иchsh
к нему. Затем выйдите из системы и снова войдите в нее, возможно,ssh
для себя @ localhost илиsu
сначала для себя в качестве теста.источник
Недавно мне пришлось решить эту проблему для моего стороннего проекта. Я сделал довольно надежное и гибкое решение, которое имитирует функции zexe preexec и precmd для bash.
https://github.com/rcaloras/bash-preexec
Первоначально он был основан на решении Глифа Лефковица, но я усовершенствовал его и обновил его. Рад помочь или добавить функцию, если это необходимо.
источник
Спасибо за подсказки! Я закончил тем, что использовал это:
Наслаждайтесь!
источник
Я написал метод для записи всех команд / встроенных команд bash в текстовый файл или сервер 'syslog' без использования патча или специального исполняемого инструмента.
Его очень легко развернуть, так как это простой сценарий оболочки, который нужно вызывать один раз при инициализации 'bash'.
Смотрите метод здесь .
источник