Завершение командной строки из истории команд

85

Итак, я посмотрел на историю и на Ctrl+ R, но они не то, что я думал, что я знал. Есть ли способ, которым я могу набрать в начале команды и циклически проходить матчи в моей истории с помощью некоторого ярлыка bash?

# mysq(some shortcut key)

Дает мне:

# mysqldump  --add-drop-table -e -q -n -C -u 
(some shortcut key)
#  mysql -u ben.dauphinee -p
Бен Дофини
источник
Примечание: для tty без рабочего стола есть <kbd> Alt + Tab </ kbd>.
neverMind9

Ответы:

91

Нажатие Ctrl+ Rоткроет обратный поиск в истории. Теперь начните вводить вашу команду, это даст первое совпадение. Нажав Ctrl+ Rснова (и снова), вы можете перебрать историю.

mysq(Ctrl+R)

Даст:

mysqldump  --add-drop-table -e -q -n -C -u 

Ctrl+ еще Rраз:

mysql -u ben.dauphinee -p
шутник
источник
5
Благодарю. Кроме того, Esc поместит выбранную команду в вашу командную строку без выполнения, а Enter запустит выбранную команду.
Бен Дофини
3
Я считаю, что CTRL + E лучше для этого, чем ESC, потому что бежать нелегко, но я уже нажимаю CTRL + R, поэтому E прямо здесь. Это также помещает курсор в конец строки, что удобно в случае, если я хотел что-то изменить (например, имя файла), что, на мой взгляд, является распространенным случаем.
Сорпигал
К сожалению, это не работает на Cygwin
ATorras
2
На Mac, по крайней мере, кажется, что mysq(CTRL+R)(CTRL+R)он не перебирает команды, начинающиеся с «mysq». Вы должны сделать (CTRL+R)mysq(CTRL+R)вместо этого
BlueRaja - Дэнни Pflughoeft
62

Чтобы расширить то, что сказал Жиль, у меня есть следующее, .inputrcчтобы связать клавиши со стрелками вверх / вниз history-search-backwardи history-search-forward:

# Key bindings, up/down arrow searches through history
"\e[A": history-search-backward
"\e[B": history-search-forward
"\eOA": history-search-backward
"\eOB": history-search-forward

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

Чтобы сделать это .bashrcвместо .inputrc, вы можете использовать:

bind '"\e[A": history-search-backward'
raychi
источник
3
эти привязки принадлежат ~ / .inputrc ... спасибо за поддержку моей лени.
Мартин Цейтлер
Стоит отметить, что '\ e' имеет решающее значение, по крайней мере, для дебютантов bash. Простое нажатие клавиши Ctrl-V, чтобы получить нажатие клавиши для вашей команды, не рассказывает всей истории. Например, нажатие клавиши Ctrl-V Meta-P (т. Е. Alt-P) возвращает ^ [p - чтобы получить желаемое поведение, замените «^ [» на «\ e».
MrMas
Согласитесь с @syslogic - поместите строки в .inputrc и отбросьте привязку и одинарные кавычки.
MrMas
скопируйте это в .inputrc на osx, я получаю: source ~ / .inputrc -bash: \ e [A :: команда не найдена -bash: \ e [B :: команда не найдена -bash: \ eOA :: команда не найден -bash: \ eOB :: команда не найдена
Кошка Морж
1
См. Superuser.com/questions/241187/how-do-i-reload-inputrc . Вы не можете найти файл.
Райчи
7

Вы также можете нажать PAGEUPкнопку для автоматического завершения команды. Он в основном ищет bash_historyфайл.

0aslam0
источник
Вы должны раскомментировать две строки /etc/inputrcили добавить эти две строки в ваш $HOME/.inputrcфайл: "\e[5~": history-search-backward "\e[6~": history-search-forward
garlix
5

Вы можете использовать команды readline history-search-backwardи history-search-forwardпереходить между командными строками, начиная с уже введенного вами префикса. Ни одна из этих команд не привязана к ключам в конфигурации по умолчанию.

Zsh (zle) имеет похожие команды history-beginning-search-backwardи history-beginning-search-forward, по умолчанию, также не привязан к клавишам. Также есть history-search-backwardи history-search-forward, который использует первое слово текущей команды в качестве префикса для поиска независимо от позиции курсора.

жилль
источник
4

Если вы хотите получить хороший обзор очень похожих команд, вы можете получить список с:

history|grep KEYSTRING

Затем скопируйте и вставьте среднюю кнопку мыши.

Ргдс - Джо

joe_zeroh
источник