лучший способ поиска по истории shell

<p>есть ли лучший способ поиска команды в моем файле истории, чем grep? у меня есть некоторое представление о том, с чего начинается команда, но я не знаю, как далеко она зашла в историю.</p><p><em>pdate:</em> раньше был специфичен только для zsh, но из-за перекрывающихся ответов не стесняйтесь отвечать здесь за любую оболочку (или режим (vi/emacs)), просто отметьте, является ли она конкретной.</p>

<p><kbd>ctrl</kbd>+<kbd>r</kbd> как правило, лучший способ, как <a href="https://unix.stackexchange.com/questions/541/best-way-to-search-my-shells-history/542#542">дескриптор сказал</a> . вы также можете использовать <code>!string</code>, которая запускает самую последнюю команду, начинающуюся с <code>string</code> или <code>!?string?</code>, которая запускает самую последнюю команду, содержащую <code>string</code>.</p><p><sub>(я думаю, что это единственное, что относится к этому вопросу, но я рассмотрел гораздо больше команд истории в <a href="https://unix.stackexchange.com/questions/6/what-are-your-favorite-command-prompt-features-or-tricks/67#67">этот ответ</a> )</sub></p>

<p>при использовании bash введите <kbd>control</kbd>-<kbd>r</kbd> и затем начните печатать. typing <kbd>control</kbd>-<kbd>r</kbd> после ввода текста несколько раз вы вернетесь в соответствующие командные строки.</p>

<p>не уверен, что это поможет, но мне нравится использовать <kbd>ctrl</kbd>-<kbd>r</kbd> и затем начните вводить команду. он должен пройти через вашу историю и представить вам первый матч. для переключения между матчами просто нажмите <kbd>ctrl</kbd>-<kbd>r</kbd> снова.</p>

<p>если добавить следующее к <code>~/.inputrc</code></p><pre><code>"\e[5~": history-search-backward "\e[6~": history-search-forward </code></pre><p>и перезапустите bash, вы можете начать печатать, а затем использовать <kbd>page up</kbd> а также <kbd>page down</kbd> перемещаться назад и вперед по истории строк, начиная с того же префикса, который вы только что набрали.</p><p>(некоторые могут предпочесть использовать <code>\e[a</code> а также <code>\e[b</code>, который заменит нормальный <kbd>up</kbd> а также <kbd>down</kbd> действия вместо привязки новых ключей.)</p>

<p>интерактивная подсказка, вызываемая <kbd>ctrl</kbd>-<kbd>r</kbd>как уже упоминалось, это самый удобный способ. кроме того, популярно переназначить <kbd>up</kbd> а также <kbd>down</kbd> клавиши со стрелками для поиска в истории префикса, который в настоящее время находится в командной строке, однако для этого требуется некоторое <a href="http://stackoverflow.org/wiki/inputrc\_for\_bash\_history\_completion\_using\_up/down\_arrows">изменения в <code>~/.inputrc</code> файл</a> .</p><p>классическое и менее интерактивное решение - использовать расширение истории shell. typing</p><pre><code>!foo </code></pre><p>выполнит последнюю команду, которая начинается с <code>foo</code> и</p><pre><code>!?foo </code></pre><p>выполнит последнюю команду, содержащую <code>foo</code>. дополнительную информацию о расширении истории можно найти в <a href="http://www.gnu.org/software/bash/manual/bashref.html#history-interaction">справочное руководство bash</a> , если предположить, что ваша оболочка является bash или совместимой.</p>

<p>если вы добавите <code>stty -ixon</code> на ваш <code>~/.bashrc</code> файл тогда <kbd>ctrl</kbd>-<kbd>s</kbd> будет идти в противоположном направлении <kbd>ctrl</kbd>-<kbd>r</kbd>,.</p>

<p>если вы введете <code>!ls</code> тогда bash просмотрит вашу историю и выполнит самую последнюю команду, которая начинается с "ls"</p>

<p><em> может быть специфичным для zsh. </em> при исследовании <a href="https://unix.stackexchange.com/questions/541/best-way-to-search-my-shells-history/542#542">этот ответ</a> i <a href="http://zsh.sourceforge.net/doc/release/zsh\_17.html#sec100">найдено</a> <code>vi-history-search-backward</code>, который позволяет искать с <kbd>/</kbd> в режиме vi (в котором я не упоминал, что я был) вы можете использовать <kbd>n</kbd> а также <kbd>n</kbd> искать вперед и назад соответственно (после нажатия <kbd>enter</kbd>).</p>

<p>я удивлен, что это не было упомянуто - но вы можете выбрать vi-mode в bash или ksh, выполнив это:</p><pre><code>set -o vi </code></pre><p>... или используя это как содержимое <code>~/.inputrc</code> (для gnu readline, используемый в таких программах, как bash):</p><pre><code>set editing-mode vi </code></pre><p>затем после этого вы можете использовать <kbd>esc</kbd> ввести <em>командный режим</em> и использовать <kbd>k</kbd> вернуться в историю, и <kbd>j</kbd> идти вперед. вы также можете искать, используя <kbd>/</kbd> искать нормально, и <kbd>?</kbd> искать в обратном порядке.</p><p>если вы используете <code>~/.inputrc</code>, тогда это будет работать не только в gnu bash, но и во всем, что использует gnu readline, например clisp, и, возможно, в таких программах, как команда mysql shell и т. cpan shell.</p>

<p>для переключения вперед при использовании обратного поиска (с помощью команды ctrl-r):</p><ol> <li> <p>откройте файл .bashrc:<br> <code>sudo gedit ~/.bashrc</code></p> </li> <li> <p>добавить эту строку (буква "f" может быть заменена другой, еще не используемой системой)</p> <pre><code>bind '"\c-f": forward-search-history' </code></pre></li> <li>закройте ваш файл и обновите ваш .bashrc (или откройте другой терминал) с помощью команды:<br> <code>source ~/.bashrc</code> или <code>. ~/.bashrc</code></li> </ol><p>теперь вы можете движиться в историю с источником: ctrl + f</p><p>работа над ubuntu 18.04 lts</p>

<p>я использую следующие два большую часть времени.<br> но обратите внимание, они оба ищут начальные символы.</p><ol> <li><strong>tcsh</strong>: введите несколько символов команды <kbd>esc</kbd>+<kbd>p</kbd> он покажет предыдущую команду, начинающуюся с этой последовательности клавиш, нажмите ее еще раз, чтобы отобразить другую команду.</li> <li><strong>ksh</strong>: использовать <code>fc -e - <space></code> <code><first few char for your previous ></code> это запустит последнюю команду, соответствующую этой последовательности.</li> </ol><p>я не смог найти что-то вроде <kbd>ctrl</kbd>+<kbd>r</kbd> в bash для моего ksh и tcsh.</p>

<p>есть способ использовать <kbd>ctrl</kbd>-<kbd>r</kbd> с <strong>tcsh</strong>. добавьте следующее в ваш <code>~/.cshrc</code>:</p><p><code>bindkey "^r" i-search-back</code> (это просто знак каретки и буква r)</p><p>это самая большая экономия времени для меня.</p>

<p>аналогичный ответ на @ephemient, но вы можете поместить в свой .bashrc</p><pre><code>bind '"\e[a": history-search-backward' bind '"\e[b": history-search-foward' </code></pre><p>и введите часть фразы, а затем используйте стрелки вверх/вниз, чтобы просмотреть самые последние варианты, которые соответствуют. это поведение по умолчанию в matlab.</p><p>для большинства людей, если вы хотите перенести свои настройки на новую систему, проще не забыть поймать только вашу <code>~/.bashrc</code> то, что вы должны поймать, что <code>~/.inputrc</code></p>

<p>да, он существует, по крайней мере, если вы используете zsh. просто начните вводить команду, а затем нажмите <kbd>m-p</kbd> (<kbd>esc</kbd> <kbd>p</kbd>) и он найдет предыдущие команды, которые соответствуют тому, что вы ввели. нажмите еще раз, чтобы найти следующий матч.</p>