Come posso impedire che i comandi vengano visualizzati nella cronologia di Bash?


93

A volte, quando eseguo comandi come rm -rf XYZ , non voglio che questo venga registrato nella cronologia di Bash, perché potrei eseguire di nuovo accidentalmente lo stesso comando da reverse-i-search. C'è un buon modo per evitare che ciò accada?



Sebbene bash possa essere utilizzato per scrivere script di shell (quindi programmazione), questo particolare aspetto non ha assolutamente nulla a che fare con la programmazione (la storia è una cosa esclusivamente interattiva). Votazioni per chiudere.
paxdiablo

Risposte:


110

Se hai impostato la HISTCONTROLvariabile di ambiente su ignoreboth(che di solito è impostata per impostazione predefinita), i comandi con uno spazio iniziale non verranno memorizzati nella cronologia (così come i duplicati).

Per esempio:

$ HISTCONTROL=ignoreboth
$ echo test1
$  echo test2
$ history | tail -n2
 1015  echo test1
 1016  history | tail -n2

Ecco cosa man bashdice:

HISTCONTROL

Un elenco di valori separati da due punti che controlla il modo in cui i comandi vengono salvati nell'elenco della cronologia. Se l'elenco dei valori include ignorespace, le righe che iniziano con uno spazio non vengono salvate nell'elenco cronologico . Un valore di ignoredupsfa sì che le righe corrispondenti alla voce precedente della cronologia non vengano salvate. Un valore di ignorebothè una scorciatoia per ignorespacee ignoredups. Un valore di . La seconda e le successive righe di un comando composto su più righe non vengono testate e vengono aggiunte alla cronologia indipendentemente dal valore di .erasedups fa sì che tutte le righe precedenti che corrispondono alla riga corrente vengano rimosse dall'elenco della cronologia prima che quella riga venga salvata. Qualsiasi valore non presente nell'elenco precedente viene ignorato. Se HISTCONTROLnon è impostato o non include un valore valido, tutte le righe lette dal parser della shell vengono salvate nell'elenco della cronologia, soggetto al valore diHISTIGNOREHISTCONTROL

Guarda anche:


51

Nel tuo .bashrc / .bash_profile / dove vuoi, metti export HISTIGNORE=' *'. Quindi inizia con uno spazio qualsiasi comando che desideri ignorare.

$ ls  # goes in history
$  ls # does not

4
Ciò dipende dal valore della HISTCONTROLvariabile d'ambiente, che non è necessariamente ignorespaceimpostata.
sorpigal

3
Se HISTCONTROLcontiene ignorespace, in realtà è ridondante includere solo "*" in HISTIGNORE. I due operano indipendentemente.
chepner

22

Uso ancora migliore HISTIGNORE. Ciò consente di specificare una serie di modelli da ignorare (come rm). È meglio (credo) che raccontare tutta la storia /dev/null.


Ah sì, me ne sono dimenticato :)
Corey Henderson

13
kill -9 $$

So che non è migliore delle risposte precedenti, ma questo ucciderà l'attuale shell Bash senza salvare nulla, utile quando HISTCONTROL non è impostato di default, ti sei dimenticato di impostarlo, o puro e semplice hai dimenticato di mettere uno spazio iniziale e hai appena digitato alcune password e non vuoi che rimangano permanentemente nella cronologia.

Questo è il modo più veloce, e qualcosa come cancellare il file della cronologia non è così buono perché devi farlo fuori da una shell di salvataggio della cronologia (accedi come utente diverso e usa su / sudo, creando un lavoro in background, ecc.)


8

Puoi fare una delle due cose:

export HISTFILE=/dev/null

Oppure inizia il comando con uno spazio.


5
uno spazio prima che sia fantastico
Eric Fortis

8
Alcuni di noi pensano che ignorare automaticamente i comandi preceduti da uno spazio sia una pessima idea e quindi non sono stati ignorespaceimpostati di default.
sorpigal

3
Modificando HISTFILEquesto modo impedisce la memorizzazione di alcuna storia, e non impedisce che il comando venga aggiunto alla storia in memoria.
chepner

3

O

unset HISTFILE

(simile alla risposta precedente solo più breve: export HISTFILE = / dev / null)


1
Ciò influisce solo sulla cronologia su disco, non sulla cronologia in memoria.
chepner

2

All'avvio della shell, pulisco esplicitamente la cronologia dalle voci che non voglio siano lì. Ad esempio, non ne voglio rm -rfnella cronologia (è un trauma dopo aver rimosso una directory piena di risultati elaborati durante la notte, solo con un singolo Arrow-Up+ Enter:)

Ho inserito il seguente frammento nel mio file di inizializzazione (funziona con .zshrc, dovrebbe funzionare anche con .bashrc)

# ...
HISTFILE=~/.zshhistory
# ...

# remove dangerous entries from the shell history
temp_histfile="/tmp/$$.temp_histfile"
grep -v -P '^rm .*-rf' $HISTFILE > $temp_histfile
mv $temp_histfile $HISTFILE
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.