28/1/2005

Manipular la història

Escrit per adriA

Conèixer la pròpia història -la del país on vivim o de la classe social en què ens ha tocat néixer- ens pot ajudar a entendre l’entorn on vivim i a no perdre el nord quan decidim on dipositar les nostres esperances i energies. Baixant a un nivell molt més prosaic, al Unix també es molt útil tenir a mà la pròpia history, encara que només sigui la història de la nostra darrera mitja hora passada al shell…

El shell enregistra totes les comanes entrades al terminal. Si en tenim necessitat - per exemple, quan volem reexectuar una comana complicada igual o semblant a una d’anterior- podem accedir a aquest historial amb la comana history. Mai he tingut la necessitat de canviar els valors per defecte que porten les distribucions GNU/Linux o Solaris. De tota manera, està bé saber que hi ha un reguitzell de variables per controlar el comportament del history (al bash els noms són bastant auto-explicatius: HISTSIZE, HISTFILE, HISTFILESIZE, … ).

Amb l’history es poden arribar a fer filigranes recordant comanes i arguments anteriors, però jo fins ara només m’he après alguns truquets senzills que crec que fan la vida al shell més fàcil i que s’assimilen ràpidament:

  • history
    La comana history simplement ens presenta numerades les comanes enregistrades. Per reexecutar qualsevol comana de la llista entrem punt d’exclamació (!) seguit del número associat a la comana. També podem fer servir nombres negatius per referir-nos a comanes anteriors, considerant que la comana actual té el número zero (p. ex. per re-exectuar la comana segona tirant cap endarrera, fem servir !-2).

  • !$
    El shell substitueix el signe d’exclamació seguit de dollar pel darrer argument o comana entrat. Quan t’acostumes a fer-ho servir, !$ pren entitat pròpia i t’oblides que estàs manipulant el history. És de gran ajuda quan es fan una sèrie consecutiva d’accessos a un fitxer concret (per exemple: ls nom_fitxer_llarguíssim_que_no_vols recordar; vim !$; mv !$ nom_curt)
  • !!
    Reexecuta la comana anterior.
  • !text:num*
    Es fa servir per referir-nos als arguments d’una comana anterior que comença amb “text". Si deixem el text buit es faran les substitucions prenent com a referent la comana immediatment anterior a l’actual. Si per exemple entrem ls -l !gi:3*, el shell donarà el llistat dels fitxers passats al gimp en una comana anterior (assumint que s’ha fet servir el gimp fa una estona, és clar), però només els fitxers que ocupaven les posicions del tercer argument fins al final de la comana. També podem referir-nos als arguments amb marges separats per un guionet (p.ex. !gi:2-4 serà substituït pels arguments 2on, 3er i 4rt passats a un programa que comença per “gi” -el gimp?- en una comana anterior). Abans hem dit que !$ és substituït pel darrer argument de la comana immediatament anterior a l’actual. Si el que volem és fer servir tots els arguments de la comana anterior, ho podem fer amb !:1*, o abreviant simplement amb !*.
  • ^antic^nou
    Reexecuta la comana anterior substituint la cadena “antic” per “nou". Aquesta substitució la faig servir bastant quan m’equivoco en el nom d’un argument amb errades de l’estil de “fixter” enlloc de “fitxer".
  • !!:[g]s//[&]/
    Una alternativa a “^^” és la comana de substitució “s", p.ex. !!:s/antic/nou/. Si col·loquem una “g” davant de la “s” el shell ens farà la substitució de totes les aparicions de “antic". Amb l’ampersand podem reafegir la cadena substituïda en qualsevol posició de la nova cadena.
  • :p
    Si afegim “:p” al final d’una comana que conté una substitució, el shell ens donarà per pantalla la comana resultant però no l’executarà. Molt sovint aparellem una comana acabada amb “:p” amb “!!"; primer mirem quin és la comana resultant de la nostra substitució i si no ens hem equivocat la executem.

A vegades és convenient passar l’history entre diferents shells. Una manera de fer-ho és entrant history -w croniques, que escriurà l’history del shell en el fitxer croniques, i després llegint en un altre shell el fitxer amb history -r croniques.

En un proper post tornaré a parlar de recuperar comanes anteriors per construir noves comanes, però aquest cop passant-les pel sedàs del vi.