Questo sito web impiega cookie tecnici e di profilazione, proseguendo nella navigazione si acconsente al loro utilizzo [info] chiudi

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?

  1. La prima è facile, copia quello da la' (la mia home) a la' (un'altra directory);
  2. vi /var/www/mysite/newfile.php;
  3. cat ~/myfooter.txt >> /var/www/mysite/newfile.php;
  4. cd /var/www/mysite/;
  5. svn ci newfile.php [ma stampa solo, non eseguire, ché non sono tanto sicuro...];
  6. svn ci newfile.php [era giusto e lo eseguo davvero]

.

Bene.
Può bastare.
Anzi tre cose ancora:

  1. rientra nell'uso dell'history anche cd -, che vi permette di saltare alla directory in cui eravate prima di un cd (comodo per fare avanti e'ndré).
  2. 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.
  3. 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...