Elimina le ultime N righe dalla cronologia di bash


40

Quando si incolla accidentalmente un file nella shell inserisce una tonnellata di brutte voci senza senso nella storia di bash. C'è un modo pulito per rimuovere quelle voci? Ovviamente potrei chiudere la shell e modificare il .bash_historyfile manualmente ma forse c'è qualche tipo di API disponibile per modificare la cronologia della shell corrente?

Risposte:


36

È possibile utilizzare history -d offsetbuiltin per eliminare una riga specifica dalla cronologia della shell corrente o history -cper cancellare l'intera cronologia.

Non è davvero pratico se si desidera rimuovere un intervallo di righe, poiché richiede solo un offset come argomento, ma è possibile inserirlo in una funzione con un ciclo.

rmhist() {
    start=$1
    end=$2
    count=$(( end - start ))
    while [ $count -ge 0 ] ; do
        history -d $start
        ((count--))
    done
}

Chiamalo con rmhist first_line_to_delete last_line_to_delete. (I numeri di riga in base all'output di history.)

(Utilizzare history -wper forzare una scrittura nel file della cronologia.)


1
Poiché l'OP ha chiesto di eliminare le N ultime righe, questo script dovrebbe essere modificato facendo qualcosa del tipo: tot_lines=$(history | wc -l)e quindi ripetere history -d $(( tot_lines - $1 )).
PlasmaBinturong,

2
Invece di $(history | wc -l), c'è la variabile $HISTCMDche può essere utilizzata.
PlasmaBinturong,

29

Solo questa riga nel prompt dei comandi sarà di aiuto.

for i in {1..N}; do history -d START_NUM; done

Dove START_NUM sta iniziando la posizione di entrata nella cronologia. N è il numero di voci che potresti voler eliminare.

ex: for i in {1..50}; do history -d 1030; done


3
Mi chiedo perché questa non sia già una funzione integrata. la "storia" è uno strumento molto antico.
Petr Gladkikh,

serve molto bene allo scopo, ma questo comando può essere visto nella storia :)
Rajeev Akotkar,

askubuntu.com/a/978276/22866 ha un buon modo per eliminare il "comando di cancellazione dalla cronologia" dalla storia :-)
HanSooloo

0

La risposta dell'utente2982704 ha quasi funzionato per me, ma non del tutto. Ho dovuto fare una piccola variazione come questa.

Supponendo che la mia cronologia sia a 1000 e voglio eliminare le ultime 50 voci

start=1000

for i in {1..50}; do count=$((start-i)); history -d $count; done
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.