31/1/2005

Més històries sobre la història

Escrit per adriA

Per concloure els dos posts d’ahir i divendres sobre l’history del shell, faré aquí un parell de notes ràpides més sobre el tema:

No ho tinc afegit per defecte al prompt del shells interactius, però a vegades veure al prompt el número del history corresponent a cada comana és pràctic. Per afegir-lo només cal incloure el caràcter especial “\!” a la variable del prompt. Per exemple:

[usuari@localhost blocs]$ history | tail -1
22 history | tail -1
[adria@localhost blocs]$ PS1="\! $PS1″
24 [adria@localhost blocs]$

A vegades ens pot interessar eliminar totes les comanes enregistrades:

history -c

farà un “clear” de l’history del shell.

30/1/2005

Revisar la història amb el vim

Escrit per adriA

El divendres vaig fer un post resumint els usos que faig del history del shell. Tot i que no la faig servir gairebé mai, amb la comana “fc” del bash també es poden modificar amb un editor de text les comanes enregistrades abans de reexectuar-les. El primer que cal és modificar la variable $FCEDIT perquè contingui el nom del vostre editor de capçalera, en el meu cas el el vim -per si no havia quedat clar en posts anteriors. (A banda de la meva predilecció pel vim, crec que fer servir un editor que funciona dins del terminal té molt sentit quan el que estem fent és treballar al shell.) Podem invocar fc indicant els números de la comanes que volem carregar a l’editor. Com amb les substitucions del history, es poden fer servir nombres negatius:

% fc -3 -1

ens obrirà el vim amb les 3 darreres comanes,

% fc 10 15

ens obrirà el vim amb les comanes 10 a 15.

Quan sortim del vim (:q), el shell interpreta les línies que hem deixat al fitxer com a comanes i les executa.

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.

26/1/2005

vi a tot arreu ( I )

Escrit per adriA

L’editor de textos és el programa que més faig servir. Quan treballo al Unix segur que el temps que passo al vim és més gran que la suma de l’estona que dedico als altres programes i activitats. Arriba un moment en què assimiles tant l’estil d’edició del vi que comences a trobar a faltar les seves comanes quan treballes amb altres programes. Per sort, quan es treballa al shell (faig servir el bash) també es poden fer edicions a la línia de comanes a l’estil vi. Per activar l’edició vi heu d’entrar la comana “set -o vi” al shell, i si us convenç podeu afegir aquest setting al .bashrc.

24/1/2005

Aclariment sobre les coloraines del ls

Escrit per adriA

L’altre dia, quan parlava de les opcions del ls, vaig dir que en general no faig servir colors per identificar el tipus de fitxer. De fet, però, en algunes ocasions si que prefereixo fer servir l’opció –color=auto. Quan estic creant links simbòlics, per evitar que em quedin links fent pengim-penjam (dangling symlink) és molt útil tenir el codi de colors; perquè quan el link creat no apunta a un directori existent el nom del link apareix sobre un fons vermell intermitent. D’aquesta manera destaca molt l’error. Més d’una vegada m’he evitat haver de perseguir aquests errors estúpid gràcies a les coloraines. L’aclariment està fet!

23/1/2005

Repetició de comanes al vim

Escrit per adriA

Al vim, per repetir l’últim canvi fet en el text d’una manera ràpida només cal prémer “.” (el punt). Si, per exemple, volem afegir la mateixa paraula en quatre llocs diferents del text, l’escrivim un cop i després ens desplacem als llocs on volem tornar a inserir-la i prement el “.” ens estalviem haver de picar de nou la paraula.

Sovint, però, els canvis que volem repetir són més complexos - per exemple, volem fer, no una, sinó varies modificacions disperses en una frase que apareix unes quantes vegades al text. Quan per fer un canvi ens cal passar de mode comana a mode inserció no podrem fer servir el punt per repetir tota la seqüència de modificacions. El que ens cal és gravar totes les tecles premudes per fer el canvi en un registre del vi, i re-executar-les més tard:

1) Abans de començar a fer el primer canvi, premem la tecla “q” seguida del nom d’un registre (per exemple, “qa"). A la cantonada esquerra inferior del terminal ens apareix la paraula recording per indicar que s’estan enregistrant les comanes i canvis entrats.

2) Fem les modificacions desitjades.

3) Per acabar l’enregistrament tornem a prémer la tecla “q".

4) Per re-executar les modificacions enregistrades fem servir @nom_registre (seguint amb l’exemple anterior, “@a"). Si volem re-executar les comanes enregistrades més d’un cop podem fer-ho ràpidament amb “@@", que repetirà la darrera comana “@nom_registre” feta servir.

L’increment de productivitat que s’aconsegueix enregistrant i re-executant canvis d’aquesta manera tan senzilla és considerable. A vegades em sap greu que alguns companys de feina i amics es resisteixin a fer servir un editor de textos potent com el vim i que es pensin que el món s’acaba en copy-pastes i expressions regulars.