martes, 20 de enero de 2009

HAL y mis ficheros

En la anterior entrada de esta serie
logramos que HAL nos respondiera temporalmente en nuestra lengua. Pero el objetivo es que lo haga permanentemente y sin que tengamos necesidad de pedírselo explícitamente a cada paso. También conseguimos saber qué variables del entorno local debemos configurar para adaptar nuestra conservación con HAL al gusto de nuestra comunidad lingüística. Lo que queda, pues, es fijar para siempre en la mente de HAL el valor de esas variables.

En adelante nos vamos a encontrar con situaciones parecidas, es decir, con situaciones en las que desearemos adaptar a HAL a nuestras necesidades. Aquí se esconden unas cuantas buenas noticias. La primera es que HAL es extremadamente versátil y nos va a permitir amoldarlo a nuestro gusto hasta límites insospechados. La segunda es que esta adaptación se podrá realizar siempre de la misma manera: editando ---esto es, creando o modificando--- ficheros de configuración. La tercera, es que estos ficheros son puros ficheros de texto y que, por tanto, todo el trabajo se reducirá a la simple manipulación de un texto.

Pensemos en tales ficheros como series de instrucciones que queremos darle a HAL antes siquiera de empezar la conversación propiamente dicha, algo así como un contexto previo, un conjunto de sobreentendidos tácitos que no será necesario actualizar a cada paso. Es algo muy semejante a lo que sucede en una conversación entre humanos. A nadie se le ocurre hacer mención de lo evidente en los cientos de situaciones de diálogo en las que nos encontramos cotidianamente. HAL no podía ser menos, la única diferencia es que debemos decírselo todo, hasta lo que para nosotros no es más que cosa de niños.

Así pues, cuando se trata de establecer ese contexto previo, lo único que habrá que saber en cada caso concreto es qué fichero editar y qué convenios lingüísticos son propios de cada fichero.

Los ficheros mediante los cuales HAL se adapta a las necesidades de un usuario concreto son ficheros que se encuentran en su directorio privado y cuyo nombre de fichero suele venir precedido por un punto. Quizá recuerde el lector el fichero .bashrc, al que aludimos en uno de los primeros capítulos de esta serie.

¿Cuál de ellos es el fichero que nos interesa ahora, o sea, el fichero que contiene la especificación del entorno local del usuario? En realidad, pueden ser varios ficheros, y dependerá de distintas cosas el que sea uno u otro. Dependerá, por ejemplo, de si nuestra conversación se inicia directamente a través de una consola virtual o sólo desde un emulador de terminal. Vamos a suponer, por lo pronto, que nuestra conversación se produce siempre desde un emulador de terminal como una ventana dentro del escritorio. Con ello, simplificamos el asunto y nos evitamos complicaciones en estas primeras fases del aprendizaje de los entresijos de HAL.

Supuesto lo anterior, el fichero que debemos editar es justamente el que antes hemos citado, o sea, el fichero .bashrc.

Lo que debemos hacer es configurar las variables de entorno descubiertas en la entrada anterior para que tengan todas el valor es_ES.UTF-8. Recordemos, una vez más, que esas variables eran LANG, LANGUAGE y LC_ALL. Por tanto, tras nuestra configuración, el fichero .bashrc debería contener estas tres líneas:


LANG=es_ES.UTF-8
LANGUAGE=es_ES.UTF-8
LC_ALL=es_ES.UTF-8


Lo primero que conviene saber es si tenemos que cambiar algo en .bashrc o, simplemente, se trata de añadirle las citadas líneas. Con toda probabilidad, y salvo que nosotros mismos hallamos modificado el fichero para definir el entorno local, nada debería haber en él sobre ese asunto. Pero no conviene dar ninguna cosa por sentada, es mejor comprobarlo.

Vamos, pues, a pedirle a HAL que nos diga si esas variables existen ya en .bashrc. Empecemos por la primera de ellas:

HAL, búscame la palabra "LANG" en el fichero .bashrc

La orden que HAL entiende para tal propósito se denomina grep, que es la abreviatura de global regular expression print. ¡Toma ya, menuda ristra de palabros! Calma, lo que esta orden hace es más sencillo de lo que parece. Primero, busca en todo el fichero (de ahí lo de global) la expresión (regular expression) que se indique. Y, segundo, escribe en nuestra pantalla (print) las líneas que contengan dicha expresión. Si no encuentra nada, no escribe nada, no imprime nada.

Que no cunda el pánico con lo de regular expression (abreviado, RE). Bajo este extraño tecnicismo hay oculta una auténtica varita mágica para la manipulación de textos, que ya habrá tiempo de explicar en su debido momento. Ahora es suficiente saber que cualquier palabra o secuencia de caracteres es también una expresión regular, una RE.

La sintaxis de la orden grep es la siguiente [Nótese que, como casi toda orden, grep también puede matizarse con opciones y que éstas se indicarían antes del primer argumento]:

grep OPCIONES RE FICHERO(S)

Un ejemplo con un fichero imaginario (sin usar ninguna opción):

HAL, busca la palabra "guapo" en el fichero piropos

equivale a:

grep guapo piropos

Por tanto, nuestra consulta de antes:

HAL, búscame la palabra "LANG" en el fichero .bashrc

quedaría así en la lengua de HAL:

grep LANG .bashrc

Y, como suponíamos, HAL no dice nada, lo que significa que la secuencia de caracteres "LANG" no existe en .bashrc .

Dejo al lector que haga la misma comprobación con "LANGUAGE" y "LC_ALL".

Tras esta comprobación, lo que queda es incluir las dichosas tres líneas en el fichero .bashrc .

Normalmente se utilizaría un programa de edición de textos para hacer esta operación. Pero vamos a hacerlo sin editor. Sí, sí, es posible, aunque parezca mentira. Siguiendo este extraño vericueto descubriremos algo realmente importante.

Antes de eso tan importante, vamos a jugar con HAL a un juego, aparentemente estúpido por infantil, al juego del eco. Le enviamos a HAL una frase para que nos devuelva su eco (echo, en inglés):

echo "Hola, HAL"

Y HAL nos responde con un eco, claro:

Hola, HAL

Tiene su gracia, ¡otra vez!:

echo "Tonto el que lo lea"

Y el eco es:

Tonto el que lo lea

¿Qué relación puede tener un juego tan inocente con algo supuestamente muy importante? La tiene y mucho. Y la tiene por una cosa que dijimos de pasada en uno de los primeros artículos: para HAL todo son ficheros, también los dispositivos de hardware. Para comprobarlo vamos a jugar de nuevo al eco, pero esta vez de forma que el eco salga en un terminal diferente al que tenemos ahora abierto.

Abramos, pues, otra ventana con un emulador de terminal, aparte de la que ya tenemos.

Como todo lo que hay en HAL, también los terminales reciben un nombre (que tiene la forma de una ruta en el árbol de directorios, como cualquier fichero). El nombre del terminal se conoce mediante la instrucción tty, que es una abreviatura de teletype, los teletipos que se usaban para comunicarse con HAL en la era de los orígenes de la informática.

Veamos cuál es el nombre de fichero de la ventana del emulador recién abierta. Tecleemos la siguiente orden en la nueva ventana:

tty

HAL me dice que mi terminal recién abierto es éste [El lector obtendrá probablemente otra respuesta, otro número al final]:

/dev/pts/12

Ahora vuelvo a mi terminal original, el que tenía abierto desde el principio, y desde él voy a dirigir un eco al nuevo terminal, al que acabo de abrir, o sea, al terminal /dev/pts/12 [El lector deberá poner aquí el nombre de fichero asociado a su terminal nuevo, es decir, la respuesta de su HAL a la orden tty anterior]:

echo "Listo el que lo lea" > /dev/pts/12

Mágico, ¿verdad? ¿Cómo es esto posible? ¿Cuál es el truco? No hay ningún truco. HAL es así.

Tratemos de extraer conclusiones del resultado anterior. Despacio y poco a poco, porque este asunto es crucial y su buena comprensión es imprescindible si se quiere ir más allá de una conversación simplona con HAL.

En primer lugar, toda orden que le damos a HAL ---ya lo hemos visto--- produce una respuesta de su parte. También la respuesta silenciosa, como la que obtuvimos con la orden grep recién vista, es una forma de respuesta.

En segundo lugar, la respuesta de HAL se muestra, por defecto, en el dispositivo desde el que enviamos la orden, o sea, hasta ahora, en la ventana de terminal donde tecleamos dicha orden.

En tercer lugar ---he aquí lo importante---, como todo dispositivo es, también, un fichero, lo anterior equivale a decir que HAL envía sus respuestas a un determinado fichero y que, por defecto, ese fichero es el dispositivo desde el que introducimos la orden. Ahora bien, siempre es posible pedirle a HAL que dirija sus respuestas a otro fichero que no sea el fichero por defecto. Por ejemplo, podría ser otro terminal (tal como acabamos de ver). Pero podría ser también un sencillo fichero de texto.

La forma en que le indicamos a HAL que dirija su respuesta a un determinado fichero es mediante el ángulo y el nombre de fichero:

> FICHERO

El espacio es opcional, es decir, también se puede escribir:

>FICHERO

Un recurso mnemotécnico para recordar este signo de ángulo es imaginarlo como si se tratase de un embudo. Lo que entra lo hace por la parte ancha, y lo que sale por la estrecha. Así, en los ejemplos anteriores, por la parte ancha del embudo entra la respuesta de HAL, que es el eco del texto que le dimos, y por la parte estrecha sale ese mismo texto que es canalizado para que se derrame sobre el recipiente de destino, el fichero pegado a la parte estrecha del embudo.

A la hora de redirigir las respuestas de HAL a un fichero de texto, debemos tener en cuenta lo siguiente:

  • Cuando el fichero de texto no existe, HAL lo crea por nosotros y le añade lo que resulta de ejecutar nuestra orden.

  • Si el fichero existe, borra todo lo que hay en él y pone en su lugar el resultado de la ejecución de nuestra orden.



Pero, entonces, ¿qué hacemos si lo que queremos es añadir algo nuevo al final de un fichero ya existente, pero sin borrar lo que ya hay en él? Para este caso concreto, HAL nos proporciona una variante de la sintaxis anterior: el "embudo doble":

>>FICHERO

Es conveniente usar el "embudo doble" siempre que haya dudas sobre la existencia del fichero de destino o, en caso de existir, sobre la utilidad de los datos que ya contiene. Si el fichero no existiese, tendría el mismo efecto que el "embudo simple".

Retomemos el hilo después de esta interesantísima desviación.

Nuestro objetivo era añadir la proyectada configuración de las variables del entorno local al fichero .bashrc. Podemos deducir fácilmente, tras la anterior explicación, que esta operación se puede realizar sin necesidad de un editor de texto, mediante la redirección de la respuesta de una orden echo al fichero .bashrc. Como ese fichero seguramente contiene ya otros datos, conviene usar el tipo de redirección explicado en último lugar. Así pues:

HAL, añade la línea "LANG=es_ES.UTF-8" al fichero .bashrc

equivale a:

echo "LANG=es_ES.UTF-8" >>.bashrc

Y lo mismo valdría para las otras dos líneas referentes a LANGUAGE y LC_ALL.

Es aburrido tener que introducir separadamente cada línea mediante una orden distinta. Una forma de hacerlo de una vez es disponer el carácter \n entre cada línea. Este carácter especial, crea justamente lo que queremos, un salto de línea. Para que echo interprete esta clase de caracteres especiales, será necesario además matizarlo con la opción -e, tal como se explica en la página de manual echo(1). Por tanto, en una sola orden, podríamos decir a HAL lo siguiente:


echo -e "LANG=es_ES.UTF-8\nLANGUAGE=es_ES.UTF-8\nLC_ALL=es_ES.UTF-8" >>.bashrc


¡Terminamos! Tarea segunda finalizada.

Y, por supuesto, el resumen, que hoy contiene muchas ideas importantes:

  • HAL es muy versátil y se puede configurar a la medida de nuestros gustos e intereses.

  • La configuración de HAL se efectúa mediante ficheros de texto.

  • La configuración personal de cada usuario está definida en ficheros que están bajo su directorio privado y cuyo nombre suele venir precedido por un punto.

  • Un fichero posible donde establecer la configuración del entorno local del usuario es el fichero .bashrc.

  • Para buscar si un fragmento de texto aparece en un ficheros o ficheros determinados se usa la orden grep.

  • La orden echo devuelve el texto que se le da como argumento.

  • La orden tty devuelve el nombre del terminal en el que la ejecutamos.

  • Toda orden que le demos a HAL recibirá una respuesta. La respuesta silenciosa también es una forma de respuesta.

  • Las respuestas de HAL aparecen por defecto en el terminal desde el que damos las órdenes.

  • Las respuesta de HAL se pueden redirigir a cualquier fichero mediante los operadores > o >>.

1 comentario:

  1. Más claro imposible. Buen trabajo,Luis. no me canso de repetir mi gratitud por tu ayuda.
    salu2. avanzamos! Eduardo.

    ResponderEliminar