08/08/2008 - Linux Feed

LINUX « E-Pillole



Cronologia comandi bash

Post inserito il 17/06/2007 da Fede in Easy Tricks

Ieri sera, mentre giocherellavo con Ubuntu sul portatile, mi serviva di recuperare alcuni parametri passati ad un ./configure diverso tempo fà. Senza fortuna, ho cercato subito nella cronologia comandi di bash, ma evidentemente il comando che andavo cercando era stato digitato troppo tempo fà ed era già uscito dalla cronologia :(

Keyboard di pietra

Se utilizzate la shell abbastanza di frequente, sarete d'accordo con me nell'affermare che la cronologia dei comandi bash è una delle "features" più utili della nostra shell preferita, e vale la pena quindi spendere qualche parola per capirne il funzionamento e per riuscire ad utilizzarla in modo profiquo.

Essendo la bash, la shell di default di quasi la totalità delle distribuzioni GNU/Linux e non solo (anche Mac utilizza la bash), in generale, le indicazioni che verranno date si adattano tranquillamente alla maggior parte dei sistemi UNIX...

Senza volere scendere troppo nei particolari e nelle definizioni teoriche, per le quali rimando alla documentazione ufficiale e alle man pages, vediamo in sintesi il "funzionamento" della cronologia dei comandi di bash e come utilizzarla.

Fondamentalmente, di default, tutto quello che viene digitato nella shell viene loggato dapprima nella propria sessione di bash, e successivamente, all'uscita, tutto quello che è stato loggato durante la sessione viene scritto nel file ~/.bash_history situato nella /home dell'utente che ha utilizzato la shell. In questo modo, ogni utente, durante la propria sessione può tener traccia anche degli ultimi comandi digitati, per poi ritrovarli alla sessione di bash successiva.

Come sempre accade nei sitemi UNIX, anche per la cronologia dei comandi bash, tutte le impostazioni di default possono essere modificate a proprio piacimento intervenendo su alcune variabili d'ambiente ed esportandole nel file ~/.bashrc, situato sempre nella /home di ogni utente che ha accesso alla shell.

Alcune delle variabili più utili sono:

- HISTFILE: il nome del file in cui si vuole loggare la cronologia dei comandi. Come detto, di default è il file ~/.bash_history

- HISTCONTROL: molto utile e già presente di default con il valore ignoredups che consente di evitare di loggare due comandi identici e digitatati in successione;

- HISTFILESIZE: numero massimo di comandi (uno per riga), salvati nel file della cronologia di bash all'uscita dalla propria sessione. Il valore di default è 500;

- HISTSIZE: numero massimo di comandi loggati durante la propria sessione bash. Anche per questa variabile, il valore di default è 500;

Detto ciò, facciamo qualche esempio pratico:

- Per modificare la posizione o il nome del file in cui salvare la propria cronologia bash sarà sufficiente esportare la variabile HISTFILE in ~/.bashrc:

export HISTFILE=/path/to/cronologia_bash

- Per impostare un valore diverso da 500 (ad esempio 1000) alla cronologia dei comandi bash della propria sessione:

export HISTSIZE=1000

- Nello stesso modo, per impostare un valore diverso da 500 (ad esempio 10000) alla cronologia dei comandi bash da loggare in $HISTFILE:

export HISTFILESIZE=10000

- Per disabilitare completamente il logging su file:

export HISTFILESIZE=0

oppure

export HISTFILE=/dev/null

Se invece non volete perdervi nemmeno un comando, potete utilizzare questo script fornito da Yaroslav Halchenko, che ho riesumato per l'occasione dalla cartella useful_scripts :)

Nella speranza che il concetto generale e il funzionamento della cronologia dei comandi bash siano un pò più chiari, veniamo ora alla parte più utile di tutto il discorso. Ossia, come utilizzare la cronologia per recuperare comandi digitati diverso tempo fà.

Ovviamente, credo sia noto che la cronologia di sessione e non, è consultabile direttamente nella shell, "premendo il tasto freccia in alto". In questo modo, è possibile scorrere in ordine cronologico partendo dall'ultimo, tutti gli $HISTSIZE comandi digitati. Decisamente utile, ma solo per comandi recenti :)

Per visualizzare invece l'intera cronologia, il comando da utilizzare è:

history

che fornisce un elenco numerato e con la relativa data degli ultimi $HISTSIZE comandi:

  ---  -------
  ---  -------
  485  2007-06-17 14:51:26 history | grep configure
  486  2007-06-17 14:52:35 man bash 
  487  2007-06-17 14:52:47 locate bashrc
  488  2007-06-17 14:57:49 ssh admin[@]192.168.10.1:222
  489  2007-06-17 14:58:01 exit
  490  2007-06-17 14:58:51 cat ~/.bash_history | grep configure
  491  2007-06-17 14:59:20 gedit /root/.bashrc
  492  2007-06-17 15:00:22 env
  ---  -------
  ---  -------

Sfruttando il comando history, potrebbe quindi essere decisamente utile "filtrare" tramite il comando grep la ricerca nella cronologia, digitando ad esempio:

history | grep configure

così da visualizzare solo l'elenco di comandi che contengono la parola configure.

Giusto per curiosità, e per dare un'idea delle infinite possibilità della bash, i comandi loggati possono essere eseguiti anche utilizzando il "numero assegnato dalla cronologia". Ad esempio, digitando:

!486

verrà eseguito il comando:

  486  2007-06-17 14:52:35 man bash

Utilizzare il comando history, non è però l'unico modo per spulciare nella cronologia della propria shell, anzi, esiste un metodo ancora più veloce e di cui non potrei più fare a meno :)

Si tratta della combinazione di tasti Ctrl+R (reverse-i-search) che consente, filtrando lettere e parole, di utilizzare molto più rapidamente la cronologia e di lanciare direttamente il comando premendo INVIO.

(reverse-i-search)`hi': history | grep configure

In conclusione, nella speranza di aver fornito qualche indicazione utile, credo siate d'accordo con me nel considerare la cronologia dei comandi bash, uno strumento utilissimo in diverse situazioni, semplice da utilizzare e che sveltisce molto il lavoro nella shell. Fortuna che esiste :)


Post letto 2458 volte | Commenti (0) | Bookmark   del.icio.us    segnalo


Commenta Post

(opzionale)
(opzionale)


Codice antispam: Codice antispam