Como percorrer a pesquisa-reversa no BASH?

444

No terminal, posso digitar CTRL-Rpara procurar um comando correspondente digitado anteriormente no BASH. Por exemplo, se eu digitar CTRL-Rthen grepis list meu último grepcomando, e posso pressionar enter para usá-lo. Isso só dá uma sugestão, no entanto. Existe alguma maneira de percorrer outros comandos correspondentes digitados anteriormente?

Vila
fonte

Respostas:

598

Se eu entendi a pergunta corretamente, você poderá percorrer as alternativas pressionando repetidamente Ctrl+R.

Por exemplo:

Ctrl+R grep Ctrl+R Ctrl+R ...

Isso pesquisa ao longo do seu histórico. Para procurar adiante, use Ctrl+S, mas talvez você precise ter definido: stty -ixon( .bash_profilemanualmente ou) antes disso para desativar o recurso XON / XOFF que assume o controle Ctrl+s. (Mais detalhes aqui .)

Runium
fonte
23
+1 - FYI - você também pode pesquisar para frente conforme esta resposta do StackOverflow .
22813 Jordan Arseno
7
E use Ctrl + Shift + r para rolagem reversa, se você passar por cima.
wiswit
19
@wiswit CTRL+SHIFT+rnão funciona para mim.
Maxim Suslov
9
@MaximSuslov Veja esta pergunta: stackoverflow.com/questions/791765/... Você pode adicionar [[ $- == *i* ]] && stty -ixonao seu .bashrc e, em seguida, CTRL+svai funcionar como o inverso deCTRL+r
gla3dr
9
@ JordanArseno Peguei "search forward" para significar "procurar por comandos que ainda não digitei" #
Josh Johnson
234

Se você acha que o comando será usado com frequência, adicione uma tag

comando #useful

Então

ctrl+r #useful

Isso funciona porque #é um delimitador de comentário, ou seja, tudo o que vem depois do símbolo não é interpretado como um comando. No entanto, será gravado na história e, portanto, é pesquisável.

Sathyam
fonte
5
Normalmente, eu gosto desse tipo de marcação. #trg_bld #open_log
Makesh
1
onde adicionar esta tag?
Sudip Bhandari
5
@SudipBhandari logo após o seu comando. # inicia um comentário. Por exemplo, ls -lah #useful #
Andrei
47

Você também pode configurar as setas para cima e para baixo para fazer uma pesquisa ligeiramente diferente adicionando estas linhas a ~ / .inputrc:

"\e[A": history-search-backward
"\e[B": history-search-forward

Em vez de procurar uma substring em qualquer lugar do comando (como Ctrl-r ), ele procurará por um comando começando com o texto à esquerda do cursor . Por exemplo, se eu executar estes comandos:

$ ls bart
$ ls fools

digite lse pressione Upduas vezes, ele será exibido ls barte o cursor no mesmo lugar. Compare com Ctrl- r, onde encontraria as lsduas na última linha, então você teria que pressioná-lo novamente para encontrar a linha anterior.

Essas abordagens têm seus pontos fortes e podem economizar muito tempo.

l0b0
fonte
2
Isso também é padrão no OS X, portanto você não precisa criar ~/.inputrce adicionar essas duas linhas.
DASKAjA 12/08
1
Como falconepi ter escrito nos comentários de esta resposta , no Ubuntu você só precisa descomentar em ~/.inputrcduas linhas, incluindo história-Search-*
Arpad Horvath
Você também pode olhar para este post para obter mais detalhes sobre esta resposta: codeinthehole.com/writing/… #
Andrei
Isso não era padrão no meu macOS (10.13). Eu sempre perdi essa funcionalidade!
forthrin 30/03
uma coisa boa sobre isso é que você ainda pode usar ctrl-p / ctrl-n para percorrer regularmente a história
qualificou
0

Há um substituto para o built-in Ctrl + Rchamado hstr . Ele permite pesquisar o histórico de comandos que corresponde a todos os tokens de pesquisa ao mesmo tempo (entre outras coisas) e alternar entre os resultados usando as teclas de seta:

Exemplo

Aqui está um screencast de demonstração .

Ele pode ser instalado em um sistema operacional da família Debian, como:

add-apt-repository ppa:ultradvorka/ppa
apt-get update
apt-get install hstr

hstr --show-configuration >> ~/.bashrc

E depois use Ctrl + R(depois de reabrir o terminal).

saaj
fonte