Могу ли я искать историю в bash и запустить результат?
10 ответов
Введите Ctrl R в командной строке и начните вводить предыдущую команду. Когда появится результат, продолжайте нажимать Ctrl R, чтобы увидеть другие совпадения. Когда появится нужная команда, просто нажмите Enter
Обратите внимание, что хотя Ctrl R является значением по умолчанию, если вы хотите, чтобы команда (reverse-search-history
) была привязана к Ctrl T, вы можете настроить это следующим образом:
bind '"\C-t": reverse-search-history'
Существует целый ряд других привязываемых команд readline, которые также доступны для вас. Взгляните на страницу руководства bash
.
Bash имеет много возможностей для поиска и доступа к интерактивной истории команд. Самым основным из которых является встроенная history
. Набрав просто:
$ history
Напечатает список команд вместе с числовым индексом, например:
$ history 1 clear 2 ls -al 3 vim ~/somefile.txt 4 history $
Затем вы можете выполнить любую из этих команд, используя их числовой индекс, предварительно указав один !
Митч отметил:
$ !1
Выполнит команду clear
. Встроенная история имеет много функций, вы можете увидеть больше на страницах руководства по bash
и history
.
Вы также можете указать относительные отрицательные смещения при использовании !
обозначение, поэтому, используя наш список истории выше, если мы хотим снова выполнить vim
, мы можем сделать:
$ !-2
Что в основном говорит bash выполнить команду, которую вы выполнили «две команды назад». Чтобы запустить предыдущую команду в списке истории, мы можем просто использовать !!
(это просто сокращение от !-1
).
!
Обозначение не ограничивает вас числовым указанием команды для запуска. Хаялчи показал, что вы можете дать команду bash
выполнить команду на основе любого текста, с которого она начинается (используя !
) или текст внутри самой команды (используя !?
). Опять же, используя наш примерный список истории выше, если мы хотим снова выполнить clear
, все, что нам нужно сделать, это набрать:
$ !cl
и нажмите Enter. А что насчет vim
? Это так просто, как:
$ !?some
Самым важным моментом в ответе Хаяльчи является вызов встроенного shopt
:
$ shopt -s histverify
Это включит проверку истории, так что команды, которые соответствуют !
!!
, а !?
указатели не выполняются вслепую, а вместо этого вводятся в командной строке, чтобы вы могли убедиться, что они не причинили вреда, прежде чем выполнять их. Это еще более важно, когда вы выполняете команды от имени пользователя root. Эта опция может быть установлена в вашем файле запуска .bashrc
так что она устанавливается при каждом входе в систему.
Как уже указывалось, всю эту информацию можно почерпнуть из справочной страницы bash
. Для!, !!, и!? указатели, взгляните на Раздел 9.3 Расширение истории.
В качестве альтернативы crtl+R вы можете искать историю, набрав
!text
Это будет искать в истории самую последнюю команду, начинающуюся с 'text'.
Но я предлагаю вам поместить это в ваш .bashrc, чтобы предотвратить выполнение неправильной команды.
shopt -s histverify
Это указывает bash на то, что после любых действий в истории (например, !!:s/prev_text/after_text
) он помещает полученную строку в командную строку. Затем вы можете просмотреть или отредактировать команду и затем нажать Enter.
Вы также можете сделать:
history | grep "stuff"
это вернуло бы что-то вроде
num stuff
тогда вы можете напечатать
!num
Я предпочитаю использовать историю поиска назад, а не историю поиска назад. Первый позволяет ввести несколько символов команды, а затем нажать клавишу поиска, вместо того, чтобы сначала нажать клавишу поиска, а затем ввести строку поиска.
По умолчанию в моей системе Mp и Mn связываются с похожими функциями, но я предпочитаю связывать клавиши со стрелками:
bind '"\e[A":history-search-backward'
bind '"\e[B":history-search-forward'
У меня действительно отличный псевдоним, ч. Это на самом деле просто «history | grep», но я отфильтровываю предыдущие записи "h command" с помощью «grep -E -v»
alias h="history | grep -E -v '^ *[0-9]+ *h ' | grep "
используется как
h aliases
2003 less .bash_aliases
Отличная рецензия, Шон! Я бы поставил это в комментарии, но я несколько застенчивых очков репутации. :-)
Другая связанная и полезная техника - это возможность выполнить предыдущую команду при смене слова. Допустим, вы указали имя каталога или хотите изменить имя файла:
$ echo my name is bob my name is bob $ ^bob^jordan echo my name is jordan my name is jordan
Обратите внимание, что команда расширяется, заменяется и выводится до ее запуска, поэтому, если запущена неправильная команда, вы можете увидеть, что думает bash.
Поскольку навигация по истории с использованием Ctrl-r является IMO громоздкой, вы можете рассмотреть hh:
https://github.com/dvorka/hstr
что делает навигацию намного проще, понятнее и эффективнее, включая запуск команды:
В командной строке bash введите control-R, затем введите несколько символов нужной вам команды, и средство чтения bash будет искать в истории команд эту команду.
После того, как вы начали поиск, вы можете снова нажать control-R, чтобы перейти к следующей соответствующей команде.
Если ваша оболочка настроена на использование привязок клавиш vi
(set -o vi
или set editing-mode vi
в $HOME/.inputrc
), тогда вы выполните поиск с помощью <Esc>/some-command<Return>
и нажмете n
(далее) ) или Shift-n
(предыдущий) для циклического просмотра истории командной строки.
CTRL+R работает просто отлично, как предложил @ John1024, но несколько утомительно, если многие из ваших недавних команд похожи, и вы хотите быстрый способ отсканировать их все. Альтернативой было бы использовать history
:
$ history | grep keyword