GNU/Linux >> Linux Esercitazione >  >> Ubuntu

Perché questo script non consente di eliminare parte della cronologia dei comandi che funziona sul computer?

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.

Correlati:Dual boot con UEFI e LUKS – Cosa devo sapere/fare?

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 .


Ubuntu
  1. Come usare il comando cronologia in Linux

  2. Ubuntu:perché il comando Xmodmap non viene eseguito all'avvio/accesso?

  3. Perché il seguente comando sta uccidendo un sistema?

  4. La cronologia dei comandi sembra mancare le prime 75 righe?

  5. Perché Oracle Java non è incluso nel repository Ubuntu standard?

Come utilizzare il comando cronologia di Linux

Come visualizzare ed eliminare la cronologia del terminale in Ubuntu 20.04

Come utilizzare il comando cronologia su CentOS 8

Trova la posizione geografica del server Ubuntu tramite la riga di comando

Perché la "riparazione all'avvio" è elencata due volte nella documentazione di Ubuntu?

Perché Ping -f si comporta in questo modo?