Lo script può essere trovato qui:https://stackoverflow.com/questions/14750650/how-to-delete-history-of-last-10-commands-in-shell
Per comodità eccolo qui:
for x in `seq $1 $2`
do
history -d $1
done
L'ho messo nella mia directory include (una che ho aggiunto al PERCORSO) dove eseguo molti altri script che ho scritto e lavoro bene.
Questo non produce il risultato desiderato di eliminare righe dalla mia cronologia, infatti non fa nulla.
Qualche idea sul perché il comando cronologia non funziona? Mi chiedo se ha qualcosa a che fare con le directory.
Informazioni aggiuntive:
Ho giocato con il codice e ho provato diverse varianti. Se metto un echo
davanti alla history
comando ed eseguirlo, ottengo il seguente output:
[email protected]:~$ idelhistory 300 305
history -d 300
history -d 301
history -d 302
history -d 303
history -d 304
history -d 305
[email protected]:~$
Quindi, a me, sembra che dovrebbe funzionare perfettamente. Non riesco a capire perché. Questo script viene eseguito da /$HOME/Scripts/ ed è stato incluso nel PATH. Ho anche provato a eseguirlo con sudo e non cambia nulla.
Risposta accettata:
In una frase:non funziona perché non lo chiami correttamente.
Innanzitutto, poiché il tuo script non inizia con #!/bin/bash
, in realtà non è uno script bash. Da quale shell viene eseguita dipende da come la invochi. Quando lo invochi dalla riga di comando bash, bash esegue il fork di una nuova istanza di se stesso (questo deve comunque accadere per eseguire qualsiasi comando esterno), ed è questa nuova istanza che esegue lo script. Quindi lo script viene eseguito con le stesse impostazioni (inclusa la cronologia finora) della shell madre. Viene eseguito con diverse opzioni; in particolare, il tracciamento della cronologia è disattivato per i comandi nello script (che fa per te, poiché altrimenti si aggiungerebbe alla cronologia che desideri modificare).
Se l'istanza bash che esegue lo script ha il HISTFILE
il set di variabili dipende dal fatto che sia stato esportato nel genitore (il che è un po' strano). Se non viene esportato e quindi impostato nel figlio, lo script figlio non salverà la cronologia modificata al termine.
Se HISTFILE
viene esportato, lo script figlio modificherà il file della cronologia. Tuttavia, a meno che tu non abbia configurato la tua shell interattiva per ricaricare la cronologia dopo ogni comando, la cronologia modificata verrà raccolta solo dalle istanze di bash appena avviate.
Se desideri eseguire uno snippet di shell che influisca sull'istanza della shell corrente, devi eseguire quella shell nell'istanza della shell corrente, invece di eseguirla come un processo secondario . Ti imbatteresti in un problema simile se volessi fare altre cose che influiscono sul processo della shell stesso, come cambiare directory, impostare variabili, ecc. Usa il .
("punto") o source
builtin per eseguire uno script nel processo di shell corrente.
. idelhistory 300 365
In alternativa, puoi definirla come una funzione nel tuo .bashrc
.