it-swarm.dev

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

Posso cercare la cronologia in bash ed eseguire il risultato?

288
Richard Hoskins

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 .

421
Sean Bright

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.

36
hayalci

Potresti anche fare:

history | grep "stuff"

sarebbe tornato qualcosa di simile

num stuff

allora puoi digitare

!num
30
Mitch

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'
14
Keith

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
12
CurtH

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.

12
Jordan

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:

enter image description here

5
Martin Dvorak

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.

3
John1024

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.

3
Fernando Basso

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
2
Mureinik