Posso cercare la cronologia in bash ed eseguire il risultato?
Genere CtrlR alla riga di comando e inizia a digitare il comando precedente. Quando viene visualizzato un risultato, continua a colpire CtrlR per vedere altre partite. Quando viene visualizzato il comando desiderato, premere semplicemente Enter
Si noti che mentre CtrlR è l'impostazione predefinita, se si desidera che il comando (reverse-search-history
) sia associato a CtrlT puoi configurarlo con il seguente:
binding ""\C-t ": reverse-search-history '
Esiste un intero Host di altri comandi legabili leggibili che sono disponibili anche per te. Dai un'occhiata a bash
man page .
Bash ha molti servizi per cercare e accedere alla cronologia dei comandi interattiva. Il più fondamentale dei quali è il history
builtin. Digitando semplicemente:
$ history
Stamperà una lista di comandi con un indice numerico, come:
$ history 1 clear 2 ls -al 3 vim ~/somefile.txt 4 history $
È quindi possibile eseguire uno qualsiasi di questi comandi utilizzando il loro indice numerico prefigurando l'indice con un singolo !
, come indicato da Mitch :
$! 1
Eseguirà il comando clear
. La cronologia incorporata ha molte funzionalità, puoi vedere di più nelle pagine man bash
e history
.
Puoi anche specificare gli offset negativi relativi quando usi il designatore !
, quindi usando la nostra lista di storia qui sopra, se volessimo eseguire nuovamente vim
, potremmo fare:
$! -2
Il che in pratica dice a bash di eseguire il comando che hai lanciato "due comandi fa". Per eseguire il comando precedente nella lista della cronologia, possiamo semplicemente usare !!
(che è solo una scorciatoia per !-1
).
La designazione !
non ti limita a specificare numericamente quale comando eseguire. hayalci ha mostrato che puoi istruire bash
per eseguire un comando basato sul testo con cui inizia (usando !
) o testo all'interno del comando stesso (usando !?
). Ancora una volta, usando la nostra lista di esempi precedenti, se volessimo eseguire nuovamente clear
, tutto ciò che dobbiamo fare è digitare:
$! cl
e premere Enter. E per quanto riguarda vim
? Questo è semplice come:
$!? alcuni
Il punto più importante della risposta hayalci è la chiamata al shopt
builtin:
$ shopt -s histverify
Ciò abiliterà la verifica della cronologia in modo che i comandi che sono abbinati ai designatori !
, !!
e !?
non siano eseguiti ciecamente, ma invece compilati sulla riga di comando in modo da poter garantire che non facciano del male prima di eseguirli. Questo è ancora più importante quando esegui i comandi come utente root. Questa opzione può essere impostata nel file di avvio .bashrc
in modo che sia impostata ogni volta che accedi.
Come è già stato sottolineato, tutte queste informazioni possono essere ricavate dalla pagina bash
man . Per il!, !!, e!? designatori, dai un'occhiata alla Sezione 9.3 History Expansion .
In alternativa a crtl+R, puoi cercare cronologia digitando
!text
Questo cercherà la cronologia per il comando più recente che inizia con 'testo'.
Ma ti suggerisco di inserire questo nel tuo .bashrc per impedire l'esecuzione di un comando errato.
shopt -s histverify
Questo istruisce bash in modo tale che, dopo any azioni della cronologia (come !!:s/prev_text/after_text
), pone la riga risultante al comando Prompt. Quindi è possibile rivedere o modificare il comando e premere Invio successivamente.
Potresti anche fare:
history | grep "stuff"
sarebbe tornato qualcosa di simile
num stuff
allora puoi digitare
!num
Preferisco usare history-search-backward su reverse-search-history. Il primo consente di digitare alcuni caratteri del comando quindi premere il tasto di ricerca, invece di premere prima il tasto di ricerca, quindi digitare la stringa di ricerca.
Di default sul mio sistema, M-p e M-n si legano a funzioni simili, ma preferisco legare i tasti freccia:
bind '"\e[A":history-search-backward'
bind '"\e[B":history-search-forward'
Ho un alias davvero eccezionale, h. È davvero solo "history | grep", ma estrapolo le precedenti voci "h comando" con "grep -E -v"
alias h="history | grep -E -v '^ *[0-9]+ *h ' | grep "
usato come
h aliases
2003 less .bash_aliases
Ottima recensione, Sean! Lo metterei in un commento, ma io sono un po 'timido punti di reputazione. :-)
Un'altra tecnica correlata e utile è la possibilità di eseguire un comando precedente mentre si cambia una parola. Supponi di aver digitato il nome della directory o di voler cambiare il nome del file:
$ echo il mio nome è bob il mio nome è bob $ ^ bob ^ jordan echo il mio nome è jordan il mio nome è jordan
Si noti che il comando è espanso, sostituito ed emesso prima dell'esecuzione del comando, quindi se viene eseguito il comando errato è possibile vedere cosa bash pensava di fare.
Siccome la navigazione nella cronologia usando Ctrl-r è IMO ingombrante, potresti prendere in considerazione hh :
https://github.com/dvorka/hstr
che rende la navigazione molto più semplice, diretta ed efficiente, incluso l'esecuzione del comando:
Al comando bash Prompt, digitare control-R, quindi digitare alcuni caratteri del comando desiderato e la funzione readlin di bash cercherà nella cronologia dei comandi per quel comando.
Dopo aver avviato la ricerca, puoi digitare control-R di nuovo per passare al comando di corrispondenza successivo.
Se hai configurato Shell per utilizzare i binding di tasti vi
(set -o vi
o set editing-mode vi
in $HOME/.inputrc
), esegui una ricerca con <Esc>/some-command<Return>
e premi n
(next) o Shift-n
(precedente) per scorrere la cronologia della riga di comando.
CTRL+R funziona bene, come suggerito da @ John1024, ma è un po 'noioso se molti dei tuoi recenti comandi sono simili e vuoi un modo rapido per scansionarli tutti. Un'alternativa sarebbe usare history
:
$ history | grep keyword