как я могу найти в истории bash и снова запустить команду?

<p>могу ли я искать историю в bash и запустить результат?</p>

<p>тип <kbd>ctrl</kbd> <kbd>r</kbd> в командной строке и начните вводить предыдущую команду. как только результат появится, продолжайте нажимать <kbd>ctrl</kbd> <kbd>r</kbd> чтобы увидеть другие матчи. когда появится нужная команда, просто нажмите <kbd>enter</kbd></p><p>обратите внимание, что в то время как <kbd>ctrl</kbd> <kbd>r</kbd> по умолчанию, если вы хотите, чтобы команда (<code>reverse-search-history</code>) была привязана к <kbd>ctrl</kbd> <kbd>t</kbd> вы можете настроить это следующим образом:</p><pre> bind '"\ c-t": обратный поиск истории " </pre><p>существует целый ряд других привязываемых команд readline, которые также доступны для вас. взгляните на страницу <a href="http://www.gnu.org/software/bash/manual/bashref.html#bindable-readline-commands"><code>bash</code> man</a> .</p><p>bash имеет много возможностей для поиска и доступа к интерактивной истории команд. самым основным из которых является встроенное <code>history</code>. набрав всего лишь:</p><pre> $ history напечатает список команд вместе с числовым индексом, например: $ история 1 очистить 2 ls -al 3 vim ~/somefile.txt 4 история $ затем вы можете выполнить любую из этих команд, используя их числовой индекс, предварительно указав индекс с одним !, как указано <a href="https://superuser.com/users/2681/mitch">mitch : $! 1 </pre><p>выполнит команду <code>clear</code>. встроенная история имеет много функций, вы можете увидеть больше на страницах руководства <code>bash</code> и <code>history</code>.</p><p>вы также можете указать относительные отрицательные смещения при использовании указателя <code>!</code>, поэтому, используя наш список истории выше, если мы хотим снова выполнить <code>vim</code>, мы могли бы сделать:</p><pre> $! -2 что в основном говорит bash выполнить команду, которую вы выполнили "две команды назад". чтобы выполнить предыдущую команду в списке истории, мы можем просто использовать !! (это просто сокращение для !-1).обозначение ! не ограничивает вас числовым указанием, какую команду запускать. <a href="https://superuser.com/users/770/hayalci">hayalci показал, что вы можете указать bash выполнять команду на основе текста, с которого она начинается (с использованием !), или текста внутри самой команды (с использованием !?). опять же, используя наш примерный список истории выше, если мы хотим снова выполнить clear, все что нам нужно сделать, это набрать: $! cl </pre><p>и нажмите <kbd>enter</kbd>, а что насчет <code>vim</code>? это так просто, как:</p><pre> $!? некоторые наиболее важный момент из ответа <a href="https://superuser.com/users/770/hayalci">hayalci - это вызов встроенной функции shopt: $ shopt -s histverify </pre><p>это включит проверку истории, так что команды, которые совпадают с указателями <code>!</code>, <code>!!</code> и <code>!?</code>, не выполняются вслепую, а вместо этого заполняются в командной строке, чтобы вы могли убедиться, что они не причинили зла перед их выполнением. это еще более важно, когда вы выполняете команды от имени пользователя root. эта опция может быть установлена в вашем файле запуска <code>.bashrc</code>, поэтому она устанавливается при каждом входе в систему.</p><p>как уже указывалось, всю эту информацию можно почерпнуть из <a href="http://www.gnu.org/software/bash/manual/bashref.html"><code>bash</code> man page</a> . для!, !!, и!? указатели, взгляните на раздел <a href="http://www.gnu.org/software/bash/manual/bashref.html#history-interaction">9.3 расширение истории</a> .</p>

<p>в качестве альтернативы <kbd>crtl+r</kbd>, вы можете искать историю, набрав</p><pre><code>!text </code></pre><p>будет выполнен поиск в истории самой последней команды <em>, начинающейся </em> с 'text'.</p><p>но я предлагаю вам поместить это в ваш .bashrc, чтобы предотвратить выполнение неправильной команды.</p><pre><code>shopt -s histverify </code></pre><p>это указывает bash на то, что после <strong>любого</strong> действия в истории (например, <code>!!:s/prev\_text/after\_text</code>) он помещает полученную строку в командную строку. затем вы можете просмотреть или отредактировать команду и затем нажать enter.</p>

<p>вы также можете сделать:</p><pre><code>history | grep "stuff" </code></pre><p>это вернуло бы что-то вроде</p><pre><code>num stuff </code></pre><p>тогда вы можете напечатать</p><pre><code>!num </code></pre>

<p>я предпочитаю использовать историю поиска назад, а не историю поиска назад. первый позволяет вам ввести несколько символов команды<em> затем </em>нажать клавишу поиска, вместо того, чтобы сначала нажать клавишу поиска, а затем набрать строку поиска.</p><p>по умолчанию в моей системе m-p и m-n связываются с похожими функциями, но я предпочитаю привязывать клавиши со стрелками:</p><pre><code>bind '"\e[a":history-search-backward' bind '"\e[b":history-search-forward' </code></pre>

<p>у меня действительно отличный псевдоним, ч. это на самом деле просто «history | grep», но я отфильтровываю предыдущие записи «h command» с помощью «grep -e -v»</p><pre><code>alias h="history | grep -e -v '^ *[0-9]+ *h ' | grep " </code></pre><p>используется как</p><pre><code>h aliases 2003 less .bash\_aliases </code></pre>

<p>отличная рецензия, шон! я бы добавил это в комментарии, но я застенчив на несколько пунктов репутации. :-)</p><p>другая связанная и полезная техника - это возможность выполнить предыдущую команду при изменении word. допустим, вы указали имя каталога или хотите изменить имя файла:</p><pre>$ echo меня зовут боб меня зовут боб $ ^ bob ^ джордан эхо меня зовут джордан меня зовут джордан</pre><p>обратите внимание, что команда расширяется, заменяется и выводится до ее запуска, поэтому, если она запущена неправильно, вы можете увидеть, что, по мнению bash, она выполняла.</p>

<p>поскольку навигация по истории с использованием ctrl-r является imo громоздкой, вы можете рассмотреть<strong> hh </strong>:</p><p> <a href="https://github.com/dvorka/hstr">https://github.com/dvorka/hstr</a> </p><p>что делает навигацию намного проще, понятнее и эффективнее, включая запуск команды:</p><p><img src="https://i.stack.imgur.com/hrlwt.jpg" alt="enter image description here"></p>

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

<p>если ваша оболочка настроена на использование привязок клавиш <code>vi</code> (<code>set -o vi</code> или <code>set editing-mode vi</code> в <code>$home/.inputrc), тогда вы выполняете поиск с помощью /some-command<return> и нажимаете n (next) или shift-n (previous) для циклического просмотра истории командной строки.

ctrl+r работает просто отлично, как предложил @ john1024, но несколько утомительно, если многие из ваших недавних команд похожи, и вы хотите быстрый способ отсканировать их все. альтернативой может быть использование <a href="https://www.gnu.org/software/bash/manual/html_node/bash-history-builtins.html">history :$ history | grep keyword </code></pre>