Мне часто приходится запускать команды повторно из истории Bash, но обычный воркфлоу очень неудобный:
- Жмем Ctrl+R, вводим часть команды
- У меня часто есть очень похожие команды и найти нужную таким способом невозможно
Или
- Вызываем history
- Ищем в недавно вызванных командах нужную
- Запускаем её по номеру, например !3128
Я начал думать как улучшить поиск по истории и наткнулся на fzf Эта утилита умеет искать строки применяя инкрементный поиск к набору строк. Если запустить
history | fzfто можно будет набрать часть команды и список строк заметно сузится, а потом можно с помощью стрелок выбрать нужную и нажать Enter. Но сама утилита fzf не писалась конкретно для history, поэтому после нажатия Enter мы всего лишь увидим в выводе терминала номер нашей команды в history и саму команду. Для того чтобы команда автоматически запускалась, я написал такую bash-функцию, которую нужно вставить в .bashrc файл
hist() {
local cmd_num=$(history | tac | fzf | awk '{print $1}')
fc -s "$cmd_num"
}Теперь я могу набрать в терминале hist, затем начать набирать часть команды, убрав лишнее. А после нажатия Enter команда автоматически запустится
Скачать fzf можно как бинарником с гитхаба, так и есть PPA для Ubuntu. Версия в репозиториях 20.04 очень старая