bash 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 Очистить bash history от дубликатов http://blog.ivnish.com/blog/127 <span>Очистить bash history от дубликатов</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> <span><span>admin</span></span> <span><time datetime="2024-12-07T12:39:40+05:00" title="суббота, декабря 7, 2024 - 12:39">07.12.2024</time> </span> <div class="field field--name-body field--type-text-with-summary field--label-hidden field__item"><pre><code class="language-plaintext">export HISTCONTROL=ignoreboth:erasedups</code></pre><p>Не помогает от слова "совсем".</p> <p>Поэтому используем более продвинутое решение</p> <pre><code class="language-plaintext">nl ~/.bash_history | sort -k 2 -k 1,1nr | uniq -f 1 | sort -n | cut -f 2 &gt; unduped_history mv unduped_history ~/.bash_history history -c history -r</code></pre><p>Эти операции придется проделывать регулярно, что не очень удобно. Можно завернуть в systemd сервис. Но я пока ограничусь bash-скриптом</p> </div> Sat, 07 Dec 2024 07:39:40 +0000 admin 127 at http://blog.ivnish.com Посчитать количество файлов в папках и подпапках http://blog.ivnish.com/blog/121 <span>Посчитать количество файлов в папках и подпапках</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/find" hreflang="ru">find</a></div> <div class="field__item"><a href="http://blog.ivnish.com/blog/tag/bash" hreflang="ru">bash</a></div> </div> <span><span>admin</span></span> <span><time datetime="2024-11-15T19:13:12+05:00" title="пятница, ноября 15, 2024 - 19:13">15.11.2024</time> </span> <div class="field field--name-body field--type-text-with-summary field--label-hidden field__item"><pre><code class="language-plaintext">find . -type f | wc -l</code></pre></div> Fri, 15 Nov 2024 14:13:12 +0000 admin 121 at http://blog.ivnish.com Найти все файлы и папки и выполнить команду http://blog.ivnish.com/blog/119 <span>Найти все файлы и папки и выполнить команду</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/find" hreflang="ru">find</a></div> </div> <span><span>admin</span></span> <span><time datetime="2024-06-19T11:38:34+05:00" title="среда, июня 19, 2024 - 11:38">19.06.2024</time> </span> <div class="field field--name-body field--type-text-with-summary field--label-hidden field__item"><pre><code class="language-plaintext">find . -exec touch -t202404121345 "{}" \;</code></pre></div> Wed, 19 Jun 2024 06:38:34 +0000 admin 119 at http://blog.ivnish.com Запустить скрипт или программу фоном http://blog.ivnish.com/blog/115 <span>Запустить скрипт или программу фоном</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/nohup" hreflang="ru">nohup</a></div> </div> <span><span>admin</span></span> <span><time datetime="2024-02-22T11:16:45+05:00" title="четверг, февраля 22, 2024 - 11:16">22.02.2024</time> </span> <div class="field field--name-body field--type-text-with-summary field--label-hidden field__item"><p>Иногда только добавление в конец <strong>&amp;</strong> может не работать. На помощь придет <strong>nohup</strong></p> <pre class="lang-bash s-code-block"><code class="language-plaintext hljs language-bash">nohup script.sh &amp;</code></pre></div> Thu, 22 Feb 2024 06:16:45 +0000 admin 115 at http://blog.ivnish.com Приглашение bash не показывает текущую директорию http://blog.ivnish.com/blog/98 <span>Приглашение bash не показывает текущую директорию</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> <span><span>admin</span></span> <span><time datetime="2023-01-06T13:26:24+05:00" title="пятница, января 6, 2023 - 13:26">06.01.2023</time> </span> <div class="field field--name-body field--type-text-with-summary field--label-hidden field__item"><p>Если на сервере bash не показывает текущую директорию, то нужно в файл .bashrc добавить</p> <p><code>export PS1="\u@\h:\w&gt;"</code></p> <p>и перелогиниться</p> </div> Fri, 06 Jan 2023 08:26:24 +0000 admin 98 at http://blog.ivnish.com Выйти из консоли без сохранения history http://blog.ivnish.com/blog/97 <span>Выйти из консоли без сохранения history</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> <span><span>admin</span></span> <span><time datetime="2023-01-06T13:25:17+05:00" title="пятница, января 6, 2023 - 13:25">06.01.2023</time> </span> <div class="field field--name-body field--type-text-with-summary field--label-hidden field__item"><p>Дерзко, да</p> <p><code>kill -9 $$</code></p> </div> Fri, 06 Jan 2023 08:25:17 +0000 admin 97 at http://blog.ivnish.com Удалить строки из файла с/по http://blog.ivnish.com/blog/96 <span>Удалить строки из файла с/по</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> <span><span>admin</span></span> <span><time datetime="2023-01-06T13:19:55+05:00" title="пятница, января 6, 2023 - 13:19">06.01.2023</time> </span> <div class="field field--name-body field--type-text-with-summary field--label-hidden field__item"><p>Чтобы удалить строки из файла с 1 по 1363, например, используем команду</p> <p><code>sed -i '1,1363d' filename</code></p> </div> Fri, 06 Jan 2023 08:19:55 +0000 admin 96 at http://blog.ivnish.com sudo и перенаправление в файл http://blog.ivnish.com/blog/2 <span>sudo и перенаправление в файл </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/debian" hreflang="ru">debian</a></div> <div class="field__item"><a href="http://blog.ivnish.com/blog/tag/bash" hreflang="ru">bash</a></div> </div> <span><span>admin</span></span> <span><time datetime="2010-08-01T14:01:58+06:00" title="воскресенье, августа 1, 2010 - 14:01">01.08.2010</time> </span> <div class="field field--name-body field--type-text-with-summary field--label-hidden field__item"><p>Одним из недостатков sudo является то, что если Вы выполните команду</p> <p><code>sudo echo 123 &gt; /файл/принадлежащий/руту&nbsp;</code></p> <p>то получите в итоге Permission denied Проблема в том, что в данном примере команда echo выполняется с правами рута, а перенаправление в файл уже нет. Это решается достаточно просто:</p> <p><code>echo 123 | sudo tee /файл/принадлежащий/руту&nbsp;</code></p> <p>Утилита tee принимает данные из потока и с правами рута записывает их файл.</p> </div> Sun, 01 Aug 2010 08:01:58 +0000 admin 2 at http://blog.ivnish.com