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

Come posso cercare nella cronologia di bash e rilanciare un comando?

Posso cercare la storia in bash ed eseguire il risultato?

Risposte (10)

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

In alternativa a crtl+R, potete cercare nella cronologia digitando

!text

Questo cercherà nella cronologia il comando più recente che inizia con ‘testo’.

Ma vi suggerisco di metterlo nel vostro .bashrc per prevenire l'esecuzione di un comando sbagliato.

shopt -s histverify

Questo istruisce bash in modo tale che, dopo qualsiasi azione della cronologia (come !!:s/prev_text/after_text), metta la linea risultante al prompt dei comandi. Poi si può rivedere o modificare il comando, e poi premere Invio.

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

Potresti anche fare:

history | grep "stuff"

restituirebbe qualcosa come

num stuff

poi puoi digitare

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

Preferisco usare history-search-backward piuttosto che reverse-search-history. Il primo permette di digitare alcuni caratteri del comando poi premere il tasto di ricerca, al contrario di premere prima il tasto di ricerca e poi digitare la stringa di ricerca.

Di default sul mio sistema, M-p e M-n si legano a funzioni simili, ma io preferisco legare i tasti freccia:

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

Ho un alias davvero fantastico, h. È davvero solo “history | grep”, ma filtro le voci precedenti del “comando h” con il “grep -E -v”

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

usato come

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

Un eccellente resoconto, Sean! Lo metterei in un commento, ma ho qualche punto di reputazione in meno :-)

Un'altra tecnica correlata e utile è la capacità di eseguire un comando precedente mentre si cambia una parola. Diciamo che avete sbagliato il nome della directory, o volete cambiare il nome del file:

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

Notate che il comando viene espanso, sostituito e visualizzato prima che il comando venga eseguito, così se viene eseguito il comando sbagliato potete vedere cosa bash pensava di fare.

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

Poiché la navigazione attraverso la cronologia usando Ctrl-r è IMO ingombrante, potresti voler considerare hh : https://github.com/dvorka/hstr

che rende la navigazione molto più semplice, diretta ed efficiente - inclusa l'esecuzione del comando:

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

Al prompt dei comandi di bash, digitate control-R, poi digitate alcuni caratteri del comando che volete e la funzione readline di bash cercherà quel comando nella cronologia dei comandi.

Dopo aver iniziato la ricerca, potete digitare di nuovo control-R per saltare al prossimo comando corrispondente.

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

Se hai la tua shell configurata per usare le associazioni di tasti vi (set -o vi o avere set editing-mode vi in $HOME/.inputrc), allora cerchi con <Esc>/some-command<Return> e premi n (successivo) o Shift-n (precedente) per scorrere la storia della linea di comando.

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

CTRL+R funziona bene, come suggerito da @John1024, ma è un po’ noioso se molti dei tuoi comandi recenti sono simili e vuoi un modo veloce per scansionarli tutti. Un'alternativa sarebbe usare history :

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

Mi piace HSTR ma a volte non riesco a installarlo. Così ho scritto un alias usando fzf che imita il suo comportamento (hx, per “history execute”)

alias hx='eval $(history | sed "s/^ *[0-9]* *//g" | fzf --tac --tiebreak=index --height=10)'
  • history : bene, ottieni la storia
  • sed : rimuovi la colonna dei numeri dalla lista (POSIX)
  • fzf : ecco la magia, ti permette di fuzzy-search la lista interattivamente, o muoverti con C-J e C-K, poi esegui un comando con Enter.
  • --height : imposta il numero di linee mostrate.
  • --tac : ripristina la lista (più logico per una storia)
  • --tiebreak=index : mantiene l'ordine della storia quando fzf aggiorna i risultati