it-swarm.xyz

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

Могу ли я искать историю в bash и запустить результат?

288
Richard Hoskins

Тип CtrlR в командной строке и начните вводить предыдущую команду. Как только результат появится, продолжайте нажимать CtrlR чтобы увидеть другие матчи. Когда появится нужная команда, просто нажмите Enter

Обратите внимание, что в то время как CtrlR по умолчанию, если вы хотите, чтобы команда (reverse-search-history) была привязана к CtrlT Вы можете настроить это следующим образом:

 bind '"\ C-t": обратный поиск истории "

Существует целый ряд других привязываемых команд readline, которые также доступны для вас. Взгляните на страницу bash man .

Bash имеет много возможностей для поиска и доступа к интерактивной истории команд. Самым основным из которых является встроенное history. Набрав всего лишь:

 $ history 

Напечатает список команд вместе с числовым индексом, например:

 $ история 
 1 очистить 
 2 ls -al 
 3 vim ~/somefile.txt 
 4 история 
 $ 

Затем вы можете выполнить любую из этих команд, используя их числовой индекс, предварительно указав индекс с одним !, как указано Mitch :

 $! 1 

Выполнит команду clear. Встроенная история имеет много функций, вы можете увидеть больше на страницах руководства bash и history.

Вы также можете указать относительные отрицательные смещения при использовании указателя !, поэтому, используя наш список истории выше, если мы хотим снова выполнить vim, мы могли бы сделать:

 $! -2 

Что в основном говорит bash выполнить команду, которую вы выполнили "две команды назад". Чтобы выполнить предыдущую команду в списке истории, мы можем просто использовать !! (это просто сокращение для !-1).

Обозначение ! не ограничивает вас числовым указанием, какую команду запускать. hayalci показал, что вы можете указать bash выполнять команду на основе текста, с которого она начинается (с использованием !), или текста внутри самой команды (с использованием !?). Опять же, используя наш примерный список истории выше, если мы хотим снова выполнить clear, все что нам нужно сделать, это набрать:

 $! cl 

и нажмите Enter, А что насчет vim? Это так просто, как:

 $!? некоторые 

Наиболее важный момент из ответа hayalci - это вызов встроенной функции shopt:

 $ shopt -s Histverify 

Это включит проверку истории, так что команды, которые совпадают с указателями !, !! и !?, не выполняются вслепую, а вместо этого заполняются в командной строке, чтобы вы могли убедиться, что они не причинили зла перед их выполнением. Это еще более важно, когда вы выполняете команды от имени пользователя root. Эта опция может быть установлена ​​в вашем файле запуска .bashrc, поэтому она устанавливается при каждом входе в систему.

Как уже указывалось, всю эту информацию можно почерпнуть из bash man page . Для!, !!, и!? указатели, взгляните на Раздел 9.3 Расширение истории .

421
Sean Bright

В качестве альтернативы crtl+R, вы можете искать историю, набрав

!text

Будет выполнен поиск в истории самой последней команды , начинающейся с 'text'.

Но я предлагаю вам поместить это в ваш .bashrc, чтобы предотвратить выполнение неправильной команды.

shopt -s histverify

Это указывает bash на то, что после любого действия в истории (например, !!:s/prev_text/after_text) он помещает полученную строку в командную строку. Затем вы можете просмотреть или отредактировать команду и затем нажать Enter.

36
hayalci

Вы также можете сделать:

history | grep "stuff"

это вернуло бы что-то вроде

num stuff

тогда вы можете напечатать

!num
30
Mitch

Я предпочитаю использовать историю поиска назад, а не историю поиска назад. Первый позволяет вам ввести несколько символов команды затем нажать клавишу поиска, вместо того, чтобы сначала нажать клавишу поиска, а затем набрать строку поиска.

По умолчанию в моей системе M-p и M-n связываются с похожими функциями, но я предпочитаю привязывать клавиши со стрелками:

bind '"\e[A":history-search-backward'
bind '"\e[B":history-search-forward'
14
Keith

У меня действительно отличный псевдоним, ч. Это на самом деле просто «history | grep», но я отфильтровываю предыдущие записи «h command» с помощью «grep -E -v»

alias h="history | grep -E -v '^ *[0-9]+ *h ' | grep "

используется как

h aliases
2003  less .bash_aliases
12
CurtH

Отличная рецензия, Шон! Я бы добавил это в комментарии, но я застенчив на несколько пунктов репутации. :-)

Другая связанная и полезная техника - это возможность выполнить предыдущую команду при изменении Word. Допустим, вы указали имя каталога или хотите изменить имя файла:

$ echo меня зовут Боб 
 меня зовут Боб 
 $ ^ bob ^ Джордан 
 эхо меня зовут Джордан 
 меня зовут Джордан

Обратите внимание, что команда расширяется, заменяется и выводится до ее запуска, поэтому, если она запущена неправильно, вы можете увидеть, что, по мнению bash, она выполняла.

12
Jordan

Поскольку навигация по истории с использованием Ctrl-r является IMO громоздкой, вы можете рассмотреть hh :

https://github.com/dvorka/hstr

что делает навигацию намного проще, понятнее и эффективнее, включая запуск команды:

enter image description here

5
Martin Dvorak

В командной строке bash введите control-R, затем введите несколько символов нужной вам команды, и средство чтения bash будет искать в истории команд эту команду.

После того, как вы начали поиск, вы можете снова нажать control-R, чтобы перейти к следующей соответствующей команде.

3
John1024

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

3
Fernando Basso

CTRL+R работает просто отлично, как предложил @ John1024, но несколько утомительно, если многие из ваших недавних команд похожи, и вы хотите быстрый способ отсканировать их все. Альтернативой может быть использование history :

$ history | grep keyword
2
Mureinik