Ho appena letto di M.F. - utente Linux - che, avendo creato un programmino per inviare SMS da shell, ha poi trovato prova inconfutabile delle proprie corna in ~/.bash_history
: una relazione di sei anni, con tanto di promessa di matrimonio e progetti prolifici (by etimo), si frantumava contro un |less
.
Pare poi che M.F. non possa vivere senza di lei e dunque, avendo letto tutti gli espliciti sessuali negli SMS inviati dalla fedifraga a terzo, ha scambiato un newsgroup di Gentoo per "La posta del cuore" e ha - seriamente, miseramente, pateticamente - chiesto consiglio a una manica di smanettoni menefreghisti. E mi sa tanto che non è colpa della tipa...
Ma se l'history
ha portato tanto dispiacere a M.F., può portare altrettanto e più diletto a tutti noi. Vi mostro come.
> history
Vi mena giù tutti i comandi salvati automaticamente in ~/bash_history
, preceduti da un numero progressivo di riga.
> history 10
Vi tira fuori gli ultimi 10. Ok, ma che me ne faccio dei numeri di riga? E' presto detto:
> !101
Esegue il comando alla posizione 101.
> !-3
Esegue il comando che compare 3 posizioni indietro partendo dal basso (conta a partire da 1, non da 0 come si aspetterebbe qualche esploratore di array
).
> !!
Richiama l'ultimo comando inserito, sinonimo di !-1
. Poi ancora:
> !wh
Richiama l'ultimo comando che inizia per "wh...". Se non dovessi ricordare se l'ultimo era un who
oppure un which
, puoi sempre digitare CTRL+r
e iniziare a scrivere una qualunque porzione del comando: mano mano che scrivi, per magia, si materializzerà l'intera riga.
.
Pausa. Vi siete scaldati? Perché ora arriva la parte divertente.
Innanzitutto una sostituzione veloce sull'ultimo comando eseguito, ^string1^string2^
.
Per esempio:
> find . -anme "*php" | wc -l
find: invalid predicate '-anme' [cazzarola!]
> ^an^na^
find . -name "*.php" | wc -l
361
Il comando !
, che da inizio ad una (cosiddetta) history expansion, supporta alcune opzioni precedute da :
(due punti).
Si possono usare numeri interi per richiamare la n-esima parola nella riga richiesta. Per esempio:
> !cp:2
designa il secondo argomento dell'ultimo comando eseguito che inizia con "cp".
Al posto del numero, si può usare ^
per riferirsi al primo argomento, oppure $
per l'ultimo (!!:$
si può accorciare in !$
).
Oppure ancora *
per richiamare tutti gli argomenti.
Poi ci sono i modificatori.
Tra i più utilizzati: :p
stampa il comando senza eseguirlo, :t
se l'argomento è un lungo path prende solo la parte finale, :h
, al contrario, rimuove solo la parte finale e prende il resto del path ("p" sta per print, "t" sta per tail, "h" sta per head).
Infine per evitare di conservare inutile ciarpame:
> export HISTIGNORE="&:ls:[bf]g:exit”
[non verranno conservati comandi duplicati, ls
, fg
, bg
e exit
].
Vi sembra troppo? State lì scettici a dire "ma chist'è scem'... chi caz se li ricorda?!". A mio immodesto parere, se li usate per un po', non ci rinunciate più.
.
Famo un esempio pratico articolato:
> cp ~/mytemplate.php /var/www/mysite/newfile.php
> vi !$
> cat ~/myfooter.txt >> !$
> cd !$:h
> svn ci !-2:$:t:p
> !!
Ve lo spiego?
- La prima è facile, copia quello da la' (la mia home) a la' (un'altra directory);
vi /var/www/mysite/newfile.php
;cat ~/myfooter.txt >> /var/www/mysite/newfile.php
;cd /var/www/mysite/
;svn ci newfile.php
[ma stampa solo, non eseguire, ché non sono tanto sicuro...];svn ci newfile.php
[era giusto e lo eseguo davvero]
.
Bene.
Può bastare.
Anzi tre cose ancora:
- rientra nell'uso dell'
history
anchecd -
, che vi permette di saltare alla directory in cui eravate prima di uncd
(comodo per fare avanti e'ndré). - l'history può costituire una falla nella sicurezza sotto molteplici aspetti (non solo per questioni di corna) e in particolare su sistemi multi-utente, ma la cosa va al di la' degli scopi di questo articolo.
- un consiglio alla morosa di M.F.: un'altra volta, prima di lasciare zozzerie nel pc, lancia "unset HISTFILE" e la lista dei comandi inseriti sarà eliminata al logout. Poi MI puoi mandare tutti i messaggi che ti pare...