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

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

268 голосов | спросил Richard Hoskins 17 J000000Friday09 2009, 23:23:49

10 ответов


390

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

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

bind '"\ C-t": reverse-search-history'

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

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

$ history

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

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

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

$! 1

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

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

$! -2

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

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

$! cl

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

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

Самый важный момент из ответа hayalci - это вызов встроенного shopt

$ shopt -s histverify

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

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

ответил Sean Bright 17 J000000Friday09 2009, 23:25:09
33

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

! Текст

Это приведет к поиску истории для самой последней команды начало с текстом.

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

shopt -s histverify

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

ответил hayalci 18 J000000Saturday09 2009, 00:40:32
26

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

история | grep "stuff"

он вернет что-то вроде

num stuff

, то вы можете ввести

! Num
ответил Mitch 18 J000000Saturday09 2009, 00:21:39
14

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

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

bind '"\ e [A": history-search-backward'
bind '"\ e [B": history-search-forward'
ответил Keith 2 FebruaryEurope/MoscowbWed, 02 Feb 2011 23:32:12 +0300000000pmWed, 02 Feb 2011 23:32:12 +030011 2011, 23:32:12
12

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

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

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

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

ответил Jordan 10 thEurope/Moscowp30Europe/Moscow09bEurope/MoscowThu, 10 Sep 2009 18:23:48 +0400 2009, 18:23:48
12

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

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

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

h aliases
2003 меньше .bash_aliases
ответил CurtH 25 thEurope/Moscowp30Europe/Moscow09bEurope/MoscowThu, 25 Sep 2014 20:45:14 +0400 2014, 20:45:14
5

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

https://github.com/dvorka/hstr

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

введите описание изображения здесь>> </p></div>
					 
						<div class=

ответил Martin Dvorak 18 ThuEurope/Moscow2014-12-18T19:37:14+03:00Europe/Moscow12bEurope/MoscowThu, 18 Dec 2014 19:37:14 +0300 2014, 19:37:14
3

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

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

ответил John1024 4 thEurope/Moscowp30Europe/Moscow09bEurope/MoscowThu, 04 Sep 2014 08:55:04 +0400 2014, 08:55:04
3

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

ответил Fernando Basso 22 72015vEurope/Moscow11bEurope/MoscowSun, 22 Nov 2015 18:21:56 +0300 2015, 18:21:56
2

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

$ history | ключевое слово grep
ответил Mureinik 4 thEurope/Moscowp30Europe/Moscow09bEurope/MoscowThu, 04 Sep 2014 09:11:10 +0400 2014, 09:11:10

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

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132