2009-07-17 19:23:49 +0000 2009-07-17 19:23:49 +0000
302
302

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

Могу ли я поискать историю в бэше и прогнать результат?

Ответы (10)

38
38
38
2009-07-17 20:40:32 +0000

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

!text

Это позволит искать в истории самую последнюю команду beginning с ‘text’.

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

shopt -s histverify

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

33
33
33
2009-07-17 20:21:39 +0000

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

history | grep "stuff"

оно возвратило бы что-то типа

num stuff

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

!num
16
16
16
2011-02-02 20:32:12 +0000

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

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

bind '"\e[A":history-search-backward'
bind '"\e[B":history-search-forward'
13
13
13
2014-09-25 16:45:14 +0000

У меня есть отличный псевдоним, h. На самом деле это просто “история | grep”, но я отфильтровываю предыдущие записи “h команды” с помощью “grep -E -v”

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

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

h aliases
2003 less .bash_aliases
12
12
12
2009-09-10 14:23:48 +0000

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

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

$ echo my name is bob my name is bob $ ^bob^jordan echo my name is jordan my name is jordan

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

6
6
6
2014-12-18 16:37:14 +0000

Поскольку навигация по истории с помощью Ctrl-r является IMO громоздкой, вы можете рассмотреть hh : https://github.com/dvorka/hstr

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

4
4
4
2014-09-04 04:55:04 +0000

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

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

3
3
3
2015-11-22 15:21:56 +0000

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

2
2
2
2014-09-04 05:11:10 +0000

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

$ history | grep keyword
0
0
0
2019-05-22 13:17:52 +0000

Мне нравится HSTR, но иногда я не могу его установить. Поэтому я написал псевдоним, используя fzf , который имитирует его поведение (hx, для “выполнения истории”)

alias hx='eval $(history | sed "s/^ *[0-9]* *//g" | fzf --tac --tiebreak=index --height=10)'
  • history : ну, получим историю
  • sed : удалим столбец с номерами из списка (POSIX)
  • fzf : вот магия, позволяющая размыть список интерактивно, или переместимся с C-J и C-K, а затем выполним команду с Enter.
  • --height : устанавливает количество показанных строк.
  • --tac : вернуть список (более логичный для истории)
  • --tiebreak=index : сохранить порядок истории, когда fzf обновляет результаты.