Conclusão da linha de comandos a partir do histórico de comandos

85

Então, olhei para a história e para o Ctrl+ R, mas elas não são o que eu pensava que sabia. Existe uma maneira de digitar o início de um comando e percorrer as correspondências do meu histórico com algum atalho do bash?

# mysq(some shortcut key)

Dá-me:

# mysqldump  --add-drop-table -e -q -n -C -u 
(some shortcut key)
#  mysql -u ben.dauphinee -p
Ben Dauphinee
fonte
Nota lateral: existe '<kbd> Alt + Tab </kbd>' para os tty sem área de trabalho.
NeverMind9

Respostas:

91

Pressionar Ctrl+ Rabrirá a pesquisa de histórico reverso. Agora comece a digitar seu comando, isso dará a primeira correspondência. Pressionando Ctrl+ Rnovamente (e novamente), você pode percorrer o histórico.

mysq(Ctrl+R)

Daria:

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

Ctrl+ Rnovamente:

mysql -u ben.dauphinee -p
abanar
fonte
5
Obrigado. Além disso, Esc colocará o comando selecionado em sua linha de comando sem executar, enquanto Enter executará o comando selecionado.
Ben Dauphinee
3
Acho CTRL + E melhor para isso do que ESC, porque a fuga é difícil de alcançar, mas eu já estou pressionando CTRL + R, então E está lá. Isso também posiciona o cursor no final da linha, o que é útil no caso de eu querer alterar algo (como um nome de arquivo) que considero um caso comum.
Sorpigal
Infelizmente, ele não funciona em Cygwin
ATorras
2
No Mac, pelo menos, parece mysq(CTRL+R)(CTRL+R)que não percorre os comandos que começam com "mysq". Você precisa fazer em (CTRL+R)mysq(CTRL+R)vez disso
BlueRaja - Danny Pflughoeft
62

Para expandir o que Gilles disse, tenho o seguinte no meu .inputrcpara vincular a tecla de seta para cima / para baixo history-search-backwarde 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

Basta digitar algo (opcional) e pressionar a tecla de seta para cima / baixo para pesquisar no histórico os comandos que começam com o que você digitou.

Para fazer isso em .bashrcvez de .inputrc, você pode usar:

bind '"\e[A": history-search-backward'
raychi
fonte
3
essas ligações pertencem a ~ / .inputrc ... obrigado por apoiar minha preguiça.
Martin Zeitler
Vale ressaltar que o '\ e' é crucial, pelo menos para os estreantes do bash. Apenas digitar Ctrl-V para obter o pressionamento de tecla do seu comando não conta toda a história. Por exemplo, digitar Ctrl-V Meta-P (ou seja, Alt-P) retorna ^ [p - para obter o comportamento desejado, substitua o "^ [" por '\ e'.
MrMas
Concordo com @syslogic - insira as linhas em .inputrc e solte a vinculação e as aspas simples.
MrMas
copiando e colando isso em .inputrc no osx, recebo: source ~ / .inputrc -bash: \ e [A :: comando não encontrado -bash: \ e [B :: comando não encontrado -bash: \ eOA :: command não encontrado -bash: \ eOB :: command not found
Walrus the Cat
1
Consulte superuser.com/questions/241187/how-do-i-reload-inputrc . Você não pode obter o arquivo.
raychi
7

Você também pode pressionar o PAGEUPbotão para concluir automaticamente um comando. Basicamente, pesquisa o bash_historyarquivo.

0aslam0
fonte
Você precisa descomentar duas linhas /etc/inputrcou adicionar essas duas linhas ao seu $HOME/.inputrcarquivo: "\e[5~": history-search-backward "\e[6~": history-search-forward
garlix
5

Você pode usar os comandos readline history-search-backwarde history-search-forwardnavegar entre as linhas de comandos começando com o prefixo que você já digitou. Nenhum desses comandos está vinculado às chaves na configuração padrão.

Zsh (zle) possui comandos semelhantes history-beginning-search-backwarde history-beginning-search-forward, também não está vinculado a chaves por padrão. Também existem history-search-backwarde history-search-forward, que usa a primeira palavra do comando atual como prefixo para pesquisar, independentemente da posição do cursor.

Gilles
fonte
4

Se você quiser uma boa visão geral de comandos muito semelhantes, poderá obter uma lista com:

history|grep KEYSTRING

Em seguida, copie e cole com o botão do meio do mouse.

Rgds - Joe

joe_zeroh
fonte