Posso cercare la cronologia in bash ed eseguire il risultato?
Posso cercare la cronologia in bash ed eseguire il risultato?
Risposte:
Digitare Ctrl Rdalla riga di comando e iniziare a digitare il comando precedente. Una volta visualizzato il risultato, continua a colpire Ctrl Rper vedere altre partite. Quando viene visualizzato il comando desiderato, premere semplicementeEnter
Si noti che while Ctrl Rè l'impostazione predefinita, se si desidera associare il comando ( reverse-search-history
) Ctrl Tè possibile configurarlo con quanto segue:
bind '"\ Ct": reverse-search-history'
Ci sono molti altri comandi collegabili readline che sono disponibili anche per te. Dai un'occhiata alla bash
pagina man .
Bash ha molte funzioni per cercare e accedere alla cronologia dei comandi interattiva. Il più semplice dei quali è history
incorporato. Digitando solo:
$ storia
Stampa un elenco di comandi insieme a un indice numerico, come:
$ storia 1 chiaro 2 ls -al 3 vim ~ / somefile.txt 4 storia $
Puoi quindi eseguire uno di questi comandi usando il loro indice numerico, precedendo l'indice con un singolo !
, come ha sottolineato Mitch :
$! 1
Eseguirà il clear
comando. La cronologia incorporata ha molte funzionalità in sé, puoi vedere di più nelle pagine man bash
e history
.
Puoi anche specificare offset negativi relativi quando usi il !
designatore, quindi usando il nostro elenco cronologico sopra, se volessimo eseguire di vim
nuovo, potremmo fare:
$! -2
Il che sostanzialmente dice a bash di eseguire il comando che hai eseguito "due comandi fa". Per eseguire il comando precedente nell'elenco cronologico, possiamo semplicemente usare !!
(che è solo una scorciatoia per !-1
).
Il !
designatore non ti limita a specificare numericamente quale comando eseguire. hayalci ha mostrato che puoi istruire bash
ad eseguire un comando basato sul testo con cui inizia (usando !
) o sul testo all'interno del comando stesso (usando !?
). Ancora una volta, usando il nostro elenco cronologico di esempio sopra, se volessimo eseguire di clear
nuovo, tutto ciò che dobbiamo fare è digitare:
$! cl
e premere Enter. E che dire vim
? È semplice come:
$!? alcuni
Il punto più importante della risposta di hayalci è la chiamata al shopt
builtin:
$ shopt -s histverify
Ciò consentirà la verifica storia in modo che i comandi che è compensato dal !
, !!
e !?
designatori non vengono eseguiti alla cieca, ma invece compilato sulla riga di comando in modo da poter garantire che faranno alcun male prima di eseguirli. Ciò è ancora più importante quando si eseguono comandi come utente root. Questa opzione può essere impostata nel tuo .bashrc
file di avvio in modo che sia impostata ogni volta che accedi.
Come è già stato sottolineato, tutte queste informazioni possono essere raccolte dalla bash
pagina man . Per il!, !! e!? designatori, dai un'occhiata alla sezione 9.3 Espansione della storia .
shopt
va in bashrc, non bash_profile (o non sarà abilitato per le shell che non sono shell di login).
In alternativa crtl+R, puoi cercare nella cronologia digitando
!text
Questo cercherà nella cronologia il comando più recente che inizia con "testo".
Ma ti suggerisco di metterlo nel tuo .bashrc per impedire l'esecuzione di comandi errati.
shopt -s histverify
Questo indica bash in modo tale che, dopo ogni azione della cronologia (come !!:s/prev_text/after_text
), posiziona la riga risultante al prompt dei comandi. Quindi è possibile rivedere o modificare il comando e premere Invio successivamente.
Preferisco usare la cronologia delle ricerche all'indietro rispetto alla cronologia delle ricerche inverse. Il primo consente di digitare alcuni caratteri del comando, quindi premere il tasto di ricerca, anziché premere prima il tasto di ricerca, quindi digitare la stringa di ricerca.
Di default sul mio sistema, Mp e Mn si legano a funzioni simili ma preferisco associare i tasti freccia:
bind '"\e[A":history-search-backward'
bind '"\e[B":history-search-forward'
Ho un alias davvero eccezionale, h. In realtà è solo "history | grep", ma filtro le precedenti voci "h command" con "grep -E -v"
alias h="history | grep -E -v '^ *[0-9]+ *h ' | grep "
usato come
h aliases
2003 less .bash_aliases
HISTIGNORE
.
Eccellente commento, Sean! Lo metterei in un commento, ma sono alcuni punti di reputazione timidi. :-)
Un'altra tecnica utile e correlata è la capacità di eseguire un comando precedente mentre si cambia una parola. Supponi di aver digitato il nome della directory o di voler modificare il nome del file:
$ echo, mi chiamo bob il mio nome è Bob $ ^ bob ^ jordan echo il mio nome è jordan il mio nome è Jordan
Si noti che il comando viene espanso, sostituito e emesso prima dell'esecuzione del comando, quindi se viene eseguito il comando errato è possibile vedere cosa bash pensava che stesse facendo.
Poiché la navigazione nella cronologia usando Ctrl-r è ingombrante, ti consigliamo di considerare hh :
https://github.com/dvorka/hstr
il che rende la navigazione molto più semplice, diretta ed efficiente, incluso l'esecuzione del comando:
ctrl + r
impostazione predefinita si lega ora
Al prompt dei comandi di bash, digitare control-R, quindi digitare alcuni caratteri del comando desiderato e la funzione readline di bash cercherà nella cronologia dei comandi quel comando.
Dopo aver avviato la ricerca, è possibile digitare nuovamente control-R per passare al comando di corrispondenza successivo.
Se la tua shell è configurata per usare i vi
key binding ( 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 cronologia della riga di comando.
Mi piace HSTR ma a volte non riesco a installarlo. Quindi ho scritto un alias usando fzf che imita il suo comportamento ( hx
, per "storia eseguita")
alias hx='eval $(history | sed "s/^ *[0-9]* *//g" | fzf --tac --tiebreak=index --height=10)'
history
: bene, ottieni la storiased
: rimuove la colonna numerica dall'elenco (POSIX)fzf
: ecco la magia, ti permette di cercare fuzzy nell'elenco interattivamente, oppure di spostarti con C-J
e C-K
, quindi eseguire un comando con Enter
.--height
: imposta il numero di righe visualizzate.--tac
: ripristina elenco (più logico per una cronologia)--tiebreak=index
: mantiene l'ordine della cronologia quando fzf aggiorna i risultati