Il modo migliore per cercare nella cronologia della shell


78

Esiste un modo migliore per cercare un comando nel mio file di cronologia di grep? Ho qualche idea di come inizi il comando, ma non so quanto sia lontana nella storia.

aggiornamento: era precedentemente specifico per zsh ma a causa delle risposte sovrapposte sentiti libero di rispondere per qualsiasi shell (o modalità (vi / emacs)) qui, nota solo se è specifico.

Risposte:


73

Ctrl+ Rè di solito il modo migliore, come diceva il descrittore . È inoltre possibile utilizzare !string, che esegue il comando più recente che inizia con string, o !?string?, che esegue il comando più recente che contiene string.

(Penso che sia l'unica cosa rilevante per questa domanda, ma ho coperto molto di più dei comandi della cronologia in questa risposta )


4
come si fa a fare in modo che 'ctrl + r' assomigli a quello?
xenoterracide,

13
@xen <kbd>Ctrl+R</kbd>. fonte della risposta
Michael Mrozek

Non mi ero reso conto che il motore SE accettasse qualsiasi html grazie.
xenoterracide,

Non sapevo che la parola chiave kbd avrebbe interpretato correttamente "ctrl" e "+"! Ho usato per taggare ogni tasto separatamente. Grazie!
Olivier Dulac il

2
@OlivierDulac Purtroppo, non è così che ho usato per formattare le chiavi; qualcuno ha modificato la mia risposta in seguito per separare le chiavi
Michael Mrozek

30

Quando si utilizza Bash, digitare Control- Re quindi iniziare a digitare. Digitazione Control: Rpiù volte dopo aver inserito del testo, si torna alle righe di comando corrispondenti.


18

Non sono sicuro se questo aiuterà, ma mi piace usare ctrl- re quindi iniziare a digitare il comando. Dovrebbe passare attraverso la tua storia e presentarti la prima partita. Per passare da una partita all'altra basta premere ctrl- di rnuovo.


2
Scusa, ho dimenticato la zsh. Potrebbe essere necessario aggiungere questo keybinding al tuo ~ / .zshrc: bindkey '^ R' history-incremental-search-backward
decriptor

17

Se aggiungi quanto segue a ~/.inputrc

"\e[5~": history-search-backward
"\e[6~": history-search-forward

e riavvia Bash, puoi iniziare a digitare, quindi utilizzare Page Upe Page Downper spostarti avanti e indietro nella cronologia delle righe iniziando con lo stesso prefisso che hai appena digitato.

(Alcuni potrebbero preferire usare \e[Ae \e[B, che sostituirà il normale Upe le Downazioni invece di associare nuove chiavi.)


Preferisco mappare questi comandi su Alt + Upe Alt + Down. A seconda dell'emulazione della tastiera, l'emulazione del terminale utilizza queste combinazioni che possono essere mappate su \E[Ae \E[A(ad es. KDE Konsole con Linux Key Bindings) oppure \E[1;3Ae \E[1;3B(ad es. XFCE Terminal o KDE Konsole con X Free 4 Bindings).
Christian Herenz,

9

Il prompt interattivo invocato da Ctrl- R, che era già stato menzionato, è il modo più conveniente. Inoltre è popolare rimappare Upe i Downtasti freccia per cercare nella cronologia un prefisso attualmente sulla riga di comando, tuttavia ciò richiede alcune modifiche al ~/.inputrcfile .

La soluzione classica e meno interattiva è utilizzare l'espansione della cronologia della shell. Digitando

!foo

eseguirà l'ultimo comando che inizia con fooe

!?foo

eseguirà l'ultimo comando che contiene foo. Maggiori informazioni sull'espansione della cronologia sono disponibili nel manuale di riferimento di Bash , supponendo che la shell sia Bash o compatibile.


6

Se aggiungi stty -ixonal tuo ~/.bashrcfile, allora Ctrl- sandrà nella direzione opposta a Ctrl- r.


Volevo usarlo C-sper questo scopo, ma il mio terminale si è bloccato ; attenzione! (Beh, non ne ho ancora assunto nessuno stty ixon, non sono sicuro di cosa sia.)
imz - Ivan Zakharyaschev,

3
@imz: C-q"si sbloccerà ". E C-ssono i caratteri di controllo di flusso software usuali, che una volta erano utile per interrompere manualmente (pausa) il flusso di uscita quando sono stati usati connessioni seriali lente. Ora l'output è così veloce nella maggior parte dei casi che quello che vuoi vedere quando premi C-sè già passato. stty -ixondisattiva il controllo del flusso del software.
Dennis Williamson,

Fantastico! Ho cercato per anni un modo per scorrere avanti nella storia come questa.
marlar

3

Se digiti, !lsbash esaminerà la tua cronologia ed eseguirà il comando più recente che inizia con "ls"


2

potrebbe essere specifico per zsh. Nella ricerca di questa risposta ho scoperto vi-history-search-backward che consente di cercare /in modalità vi (di cui non ho parlato in precedenza), quindi è possibile utilizzare ne Ncercare rispettivamente avanti e indietro (dopo aver premuto enter).


2

Sono sorpreso che questo non sia stato menzionato, ma puoi selezionare vi-mode in bash o ksh facendo questo:

set -o vi

... o usando questo come contenuto di ~/.inputrc(per readline GNU usato in programmi come bash):

set editing-mode vi

Quindi, è possibile utilizzare Escper accedere alla modalità comando e utilizzare kper tornare indietro nella cronologia e jper andare avanti. Puoi anche cercare usando /per cercare normalmente e ?per cercare al contrario.

Se lo usi ~/.inputrc, funzionerà non solo con GNU bash ma con qualsiasi cosa utilizzi readline GNU come CLISP e possibilmente programmi come la shell dei comandi MySQL e come la shell CPAN.


2

Per passare in avanti quando si utilizza la ricerca inversa (con il comando Ctrl-R):

  1. Apri il tuo file .bashrc:
    sudo gedit ~/.bashrc

  2. aggiungi questa riga (la lettera "f" può essere sostituita con un'altra non ancora utilizzata dal sistema)

    bind '"\C-f": forward-search-history' 
  3. Chiudi il tuo file e aggiorna il tuo .bashrc (o apri un altro terminale) con il comando:
    source ~/.bashrco. ~/.bashrc

ORA PUOI ANDARE AVANTI NELLA STORIA CON LO SCORCIATO: Ctrl + f

Lavorando su Ubuntu 18.04 LTS


1

Uso seguendo due la maggior parte delle volte.
Ma per favore nota che entrambi cercano caratteri iniziali.

  1. tcsh : digita alcuni caratteri del comando quindi Esc+ pmostrerà il comando precedente a partire da quella sequenza di tasti premendolo di nuovo mostrerà un altro comando.
  2. ksh : usa fc -e - <SPACE> <first few char for your previous >questo eseguirà l'ultimo comando corrispondente a quella sequenza.

Non sono riuscito a trovare qualcosa come Ctrl+ Rin Bash per i miei ksh e tcsh.


3
Ctrl + r funziona in modo leggermente diverso in ksh rispetto a Bash. Premi Ctrl + r, quindi digita la stringa che stai cercando e premi Invio . Per cercare la stessa cosa, premi Ctrl + r ed inserisci senza dover digitare nuovamente la stringa. Questo è in set -o emacsmodalità, a proposito.
Dennis Williamson,

@Dennis: +1 :-)
Hemant,

1

C'è un modo di usare Ctrl- Rcon tcsh . Aggiungi quanto segue nel tuo ~/.cshrc:

bindkey "^r" i-search-back (è solo un cartello con il cursore e la lettera r)

Questo è il più grande risparmio di tempo per me.


1

risposta simile a @ephemient, ma puoi inserirlo nel tuo .bashrc

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

e digitare parte della frase, quindi utilizzare la freccia su / giù per sfogliare le opzioni più recenti corrispondenti. Questo è il comportamento predefinito di matlab.

Per la maggior parte delle persone, se si desidera trasferire le proprie impostazioni su un nuovo sistema, è più facile ricordare di afferrare solo le proprie, ~/.bashrcquindi che è necessario afferrarle~/.inputrc


0

Sì, esiste, almeno se stai usando zsh. Basta iniziare a digitare il comando e quindi premere M-p( ESC p) e troverà i comandi precedenti che corrispondono a ciò che hai digitato. Premerlo di nuovo per trovare la prossima partita.


Questa risposta può avere più spiegazioni.
phunehehe,
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.