Ricerca cronologia bash, parziale + freccia su


146

Ho cercato, ma non ho trovato nulla al riguardo. Sto cercando una funzionalità in bash, usando un terminale.

Molto tempo fa, avevo un utente su un sistema debian e un amico mi ha impostato con una comoda funzione di ricerca della cronologia (credo di aver usato tcsh allora), dove avrei digitato l'inizio di un comando precedente, premendo su-freccia, e farebbe una ricerca, basata sulla stringa parziale.

Ad esempio se la mia storia è:

./script.pl
./script.pl arg1
cat output
cat output | grep yada

E digito ., e premere il tasto freccia su, sarebbe mostrarmi: ./script.pl arg1. Premerlo di nuovo e verrà visualizzato ./script.pl, ecc.

grepProprio come se eseguisse un on .bash_history. C'è un modo per ottenere questa funzionalità?



1
@Marcel Sembra che potrebbe essere la stessa risposta, l'ho visto nella ricerca, ma non l'ho collegato alla mia domanda, con le parole chiave di iPython e Shell.
TLP,

Risposte:


197

Inserisci le seguenti righe nel tuo ~/.inputrc:

## arrow up
"\e[A":history-search-backward
## arrow down
"\e[B":history-search-forward

Le righe che iniziano con #sono commenti. Non riesco a ricordare cosa sia indietro e cosa avanti. Sperimenta con esso. Forse devi passare avanti e indietro.


Un po 'di informazioni di base:

Bash utilizza readline per gestire il prompt. ~/.inputrcè il file di configurazione per readline. Notare che ciò avrà effetto anche su altri software che utilizzano la libreria readline, ad esempio IPython .

Leggi il manuale di bash per maggiori informazioni su readline. Qui puoi anche trovare altri comandi readline relativi alla cronologia .

Per ottenere i codici di escape per i tasti freccia è possibile effettuare le seguenti operazioni:

  1. Inizia catin un terminale (solo cat, senza ulteriori argomenti).
  2. Digita i tasti sulla tastiera, otterrai cose come ^[[Ala freccia su e ^[[Bla freccia giù.
  3. Sostituisci ^[con \e.

1
Fantastico, ma questa soluzione disabilita le scorciatoie ctrl-sinistra / ctrl-destra.
Eyal,

Qualcuno può dirmi come posso ottenere lo stesso per make
Hitesh Kumar

@lesmana, darei punti extra solo per la parte del gatto
Mike D,

Seconding @Eyal, qualcuno ha consigli su come posso avere questo, ma conservare le scorciatoie ctrl-left / ctrl-right?
kbrose,

6
Per preservare tutte le impostazioni predefinite aggiungere $include /etc/inputrc, preferibilmente sulla prima riga.
Tulio Casagrande,

31

Crea un file chiamato setup_readline.sh con la modalità 644 in /etc/profile.d/ con il seguente contenuto, accedi e controlla le tue chiavi preferite:

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

Penso che sia il modo migliore per farlo. Principalmente se si utilizzano sistemi di gestione della configurazione come chef, burattino, ecc

E la configurazione del sistema non è stata toccata!


4
Stranamente ~ / inputrc non ha funzionato per me - ma l'inserimento di questi comandi in .bash_profile ha funzionato.
Joe,

1
.inputrc non esiste nella mia cartella home e preferisco avere questo tipo di impostazioni in .bashrc comunque in modo da poter semplicemente trasportare un solo file per le mie impostazioni. Quindi questa è probabilmente una risposta migliore quindi accettata.
Shital Shah,

.inputrc funziona favolosamente per me, ma non dopo averlo caricato screen. La cosa strana è che altre scorciatoie .inputrc funzionano, ma non queste. Quindi ora uso entrambe le soluzioni.
Orwellophile,

Questo è molto utile quando, ad esempio, accedi a un server per fare le cose e non ne hai il controllo e non vuoi modificare e ricaricare ~ / .inputrc sul server.
danmactough,

13

Ctrl + R ti darà questo tipo di funzionalità. Inizia a digitare un comando parziale e ne verranno fuori di vecchi che puoi navigare con le frecce su e giù. Ulteriori informazioni: http://www.nuxified.org/blog/ctrl_r_in_the_bash_shell


2
Grazie per la tua risposta. Sì, l'ho provato, ma lo trovo un po '... schizzinoso. Non mi permetterà di scorrere i comandi a partire dal parziale, mostra solo il primo. Cerca anche l'intero comando per il personaggio, che è quasi inutile.
TLP,

5
@TLP, colpire ripetutamenteCtrl+r
akostadinov

4

Per completare la risposta di lesmana su "~ / .inputrc" che dovrei creare con il mio Trusty 14.04, verifica / aggiungi in "~ / .bashrc" (la prima riga esiste già nel mio "~ / .bashrc"):

shopt -s histappend  
PROMPT_COMMAND='history -a'  

È già spiegato in francese in https://doc.ubuntu-fr.org/terminal?&#pour_completer_les_commandes_a_partir_de_l_historique .


2
Questo comando in pratica indica a bash di aggiungere immediatamente il comando al file della cronologia invece di attendere la fine della sessione. È utile se hai molti terminali aperti e non vuoi perdere la cronologia in uno, ma altrimenti non è necessario. digitalocean.com/community/tutorials/…
Shital Shah,

3

Forse potresti voler provare https://github.com/dvorka/hstr che fornisce un filtraggio semplice e multilinea della cronologia di Bash che come basato su una metrica (quando, quanto spesso e la lunghezza dei comandi sono importanti) - puoi usare tasti freccia per navigare facilmente nella cronologia:

inserisci qui la descrizione dell'immagine

Può essere facilmente associato a Ctrl-re / oCtrl-s


0

La seguente soluzione combina ed estende alcuni degli approcci sopra menzionati: aggiungi le seguenti righe al tuo ~/.bash_aliasesfile (non è necessario ~/.inputrc) per ottenere il seguente comportamento:

  1. spostarsi su / giù nella cronologia (solo voci con lo stesso prefisso) premendo CTRL + SU e CTRL + GIÙ. Ciò può coesistere con la funzionalità standard di spostarsi verso l'alto / il basso nell'intera cronologia solo tramite SU e GIÙ
  2. passa alla parola successiva / precedente in una riga di comando premendo CTRL + DESTRA e CTRL + SINISTRA
bind '"\e[1;5A":history-search-backward'
bind '"\e[1;5B":history-search-forward'
bind '"\e[1;5C":forward-word'
bind '"\e[1;5D":backward-word'

Accedere nuovamente alla shell (o eseguire source ./bash_aliases) per applicare le modifiche.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.