history http://blog.ivnish.com/ ru Делаем поиск по истории команд удобнее с помощью fzf http://blog.ivnish.com/blog/144 <span>Делаем поиск по истории команд удобнее с помощью fzf</span> <div class="field field--name-field-blog-tags field--type-entity-reference field--label-hidden field__items"> <div class="field__item"><a href="http://blog.ivnish.com/blog/tag/bash" hreflang="ru">bash</a></div> <div class="field__item"><a href="http://blog.ivnish.com/blog/tag/history" hreflang="ru">history</a></div> </div> <span><span>admin</span></span> <span><time datetime="2026-02-04T13:56:45+05:00" title="среда, февраля 4, 2026 - 13:56">04.02.2026</time> </span> <div class="field field--name-body field--type-text-with-summary field--label-hidden field__item"><p>Мне часто приходится запускать команды повторно из истории Bash, но обычный воркфлоу очень неудобный:</p> <ul> <li data-list-item-id="e8ca848604db52229da28371f36079edb">Жмем Ctrl+R, вводим часть команды</li> <li data-list-item-id="e25cd873436b541175e7c76220ffdd831">У меня часто есть очень похожие команды и найти нужную таким способом невозможно</li> </ul> <p>Или</p> <ul> <li data-list-item-id="e7333f1e806248834e9aea4fad73c2aad">Вызываем history</li> <li data-list-item-id="efb5744ecec231db7e7092ca496bcffef">Ищем в недавно вызванных командах нужную</li> <li data-list-item-id="e7fbd13f8705b6e3d169523d036552415">Запускаем её по номеру, например !3128</li> </ul> <p>Я начал думать как улучшить поиск по истории и наткнулся на <a href="https://github.com/junegunn/fzf">fzf</a> Эта утилита умеет искать строки применяя инкрементный поиск к набору строк. Если запустить</p> <pre><code class="language-plaintext">history | fzf</code></pre><p>то можно будет набрать часть команды и список строк заметно сузится, а потом можно с помощью стрелок выбрать нужную и нажать Enter. Но сама утилита fzf не писалась конкретно для history, поэтому после нажатия Enter мы всего лишь увидим в выводе терминала номер нашей команды в history и саму команду. Для того чтобы команда автоматически запускалась, я написал такую bash-функцию, которую нужно вставить в .bashrc файл</p> <pre><code class="language-plaintext">hist() { local cmd_num=$(history | tac | fzf | awk '{print $1}') fc -s "$cmd_num" }</code></pre><p>Теперь я могу набрать в терминале <strong>hist</strong>, затем начать набирать часть команды, убрав лишнее. А после нажатия Enter команда автоматически запустится</p> <p>Скачать fzf можно как <a href="https://github.com/junegunn/fzf/releases">бинарником с гитхаба</a>, так и есть <a href="https://launchpad.net/ubuntu/+source/fzf">PPA</a> для Ubuntu. Версия в репозиториях 20.04 очень старая</p> </div> Wed, 04 Feb 2026 08:56:45 +0000 admin 144 at http://blog.ivnish.com