Come posso cercare nella cronologia di bash ed eseguire nuovamente un comando?


Risposte:


428

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 bashpagina man .

Bash ha molte funzioni per cercare e accedere alla cronologia dei comandi interattiva. Il più semplice dei quali è historyincorporato. 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 clearcomando. La cronologia incorporata ha molte funzionalità in sé, puoi vedere di più nelle pagine man bashe history.

Puoi anche specificare offset negativi relativi quando usi il !designatore, quindi usando il nostro elenco cronologico sopra, se volessimo eseguire di vimnuovo, 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 bashad 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 clearnuovo, 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 shoptbuiltin:

$ 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 .bashrcfile di avvio in modo che sia impostata ogni volta che accedi.

Come è già stato sottolineato, tutte queste informazioni possono essere raccolte dalla bashpagina man . Per il!, !! e!? designatori, dai un'occhiata alla sezione 9.3 Espansione della storia .


39
+1 Uso Linux da oltre 12 anni per tutti i sistemi. Non sapevo che esistesse. Vorrei poter +10 come mi sono perso ??
Aiden Bell,

1
Su molti sistemi, premere la freccia su fa lo stesso.
Mas,

Se qualcuno dovesse consolidare "!", "!!", "!?", "Storia | grep "e" ctrl-r "in una risposta completa, lo selezionerei
Richard Hoskins,

shoptva in bashrc, non bash_profile (o non sarà abilitato per le shell che non sono shell di login).
Tobu,

2
Inoltre, dopo aver premuto CTRL + R, puoi usare CTRL + MAIUSC + R più volte per tornare al comando precedente
Gal Bracha,

37

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.


5
Utilizzare!? Text per rieseguire il comando più recente contenente (al contrario di iniziare) "text".
mark4o

3
Se qualcuno dovesse consolidare "!", "!!", "!?", "Storia | grep 'e' ctrl-r 'in una risposta completa, lo selezionerei.
Richard Hoskins,

32

Puoi anche fare:

history | grep "stuff"

restituirebbe qualcosa del genere

num stuff

allora puoi digitare

!num

15

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'

13

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

1
Questo può essere realizzato anche aggiungendo il comando a HISTIGNORE.
tanenbring,

12

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.


6

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:

inserisci qui la descrizione dell'immagine


Come usarlo? Quali tasti premere per vedere questa immagine?
Nakilon,

2
Una volta installato hh è possibile utilizzare il comando hh O associarlo a qualsiasi scorciatoia da tastiera (in genere Ctrl-r) come descritto nella documentazione.
Martin Dvorak,

per ctrl + rimpostazione predefinita si lega ora
Alleo

4

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.


3

Se la tua shell è configurata per usare i vikey binding ( set -o vio avere set editing-mode viin $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.


Questo è il più vicino agli utenti di VIM.
Gabor Marton,

2

CTRL+ Rfunziona bene, come suggerito da @ John1024, ma è un po 'noioso se molti dei tuoi comandi recenti sono simili e vuoi un modo rapido per scansionarli tutti. Un'alternativa sarebbe usare history:

$ history | grep keyword

0

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 storia
  • sed : rimuove la colonna numerica dall'elenco (POSIX)
  • fzf: ecco la magia, ti permette di cercare fuzzy nell'elenco interattivamente, oppure di spostarti con C-Je 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
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.