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

157017
Richard Hoskins

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

279

10 ответов на вопрос

403
Sean Bright

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

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

связать "\ Ct": обратный поиск истории " 

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

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

$ история 

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

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

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

$! 1 

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

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

$! -2 

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

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

$! cl 

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

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

Самый важный момент из ответа Хаяльчи - это вызов shoptвстроенного:

$ shopt -s Histverify 

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

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

+1 Я использую Linux более 12 лет для всех систем. Я не знал, что существует. Жаль, что я не мог +10 * как я это пропустил ?? * Aiden Bell 14 лет назад 35
Я не обнаружил это, пока не начал регулярно использовать emacs. Затем я случайно набрал его в bash однажды (думая, что я в Emacs). Sean Bright 14 лет назад 0
Во многих системах нажатие стрелки вверх делает то же самое. mas 14 лет назад 1
Стрелка вверх для меня просто идет к предыдущей команде. Но да, это все привязано к тому, что вы хотите. Sean Bright 14 лет назад 3
Если кто-то объединит «!», «!!», «!?», «История | grep 'и' ctrl-r 'в исчерпывающий ответ, я бы выбрал его Richard Hoskins 14 лет назад 0
@richardhoskins - готово. Sean Bright 14 лет назад 0
`shopt` идет в bashrc, а не в bash_profile (или он не будет включен для оболочек, которые не являются оболочками входа в систему). Tobu 13 лет назад 0
Также после нажатия CTRL + R вы можете использовать CTRL + SHIFT + R несколько раз, чтобы вернуться к предыдущей команде Gal Bracha 8 лет назад 2
Вы также можете запустить `!!` для запуска предыдущей команды. Например, `sudo !!` для запуска предыдущей команды с помощью sudo. sotoz 7 лет назад 0
35
hayalci

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

!text 

Это будет искать в истории самую последнюю команду, начинающуюся с 'text'.

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

shopt -s histverify 

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

Используйте!? Text для повторного выполнения самой последней команды, содержащей (в отличие от начала) текст. mark4o 14 лет назад 5
Если кто-то объединит «!», «!!», «!?», «История | grep 'и' ctrl-r 'в исчерпывающий ответ, я бы выбрал его. Richard Hoskins 14 лет назад 3
29
Mitch

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

history | grep "stuff" 

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

num stuff 

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

!num 
14
Keith

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

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

bind '"\e[A":history-search-backward' bind '"\e[B":history-search-forward' 
12
Jordan

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

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

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

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

12
CurtH

I have a really great alias, h. It's really just "history | grep", but I filter out previous "h command" entries with the "grep -E -v"

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

used like

h aliases 2003 less .bash_aliases 
Это также можно сделать, добавив команду в HISTIGNORE. tanenbring 6 лет назад 0
5
Martin Dvorak

As navigation through history using Ctrl-r is IMO cumbersome, you may want to consider hh:

https://github.com/dvorka/hstr

which makes navigation much simpler, straightforward and efficient - including running the command:

enter image description here

Как это использовать? Какие клавиши нажать, чтобы увидеть эту картинку? Nakilon 9 лет назад 0
После установки hh вы можете использовать команду hh ИЛИ привязать ее к любому сочетанию клавиш (обычно Ctrl-r), как описано в документации. Martin Dvorak 9 лет назад 2
теперь он привязывается к `ctrl + r` по умолчанию Alleo 6 лет назад 0
3
John1024

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

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

3
Fernando Basso

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

Этот самый близкий к vim пользователям. Gabor Marton 6 лет назад 0
2
Mureinik

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

$ history | grep keyword 

Похожие вопросы