Habrá ocasiones en que necesitaremos almacenar un valor o una cadena de carácteres al realizar alguna operación con el shell, para después pasarle éste valor a otro programa o, simplemente, para después examinarlo. El shell proveé de una manera de realizar esto por medio de las variables de entorno, también llamadas variables de ambiente.
Estas variables existen únicamente durante la ejecución del shell. Así, si en una sesión creamos una variable o modificamos su valor, al terminar la sesión éste se pierde.
Para asignar un valor a una variable, basta con poner el nombre de la variable seguido de un signo de igual y el valor:
$ variable=valor
El nombre de la variable precedido por el carácter $
es
el valor de la variable. La mejor manera de examinar el valor es
utilizando el comando echo
:
$ color=rojo $ echo $color rojo $ telefono=5552314 $ echo $telefono 5552314 $
Cuando se necesita asignar a una variable una cadena que
incluye espacios o carácteres que normalmente el
em shell
interpretaría, es necesario encerrar el valor entre comillas
sencillas:
$ hacer='tengo que pasar al super; ir a la tintorer\'\i{}a; hablarle a mi tia' $ echo $hacer tengo que pasar al super; ir a la tintorer\'\i{}a; hablarle a mi tia $
El shell tiene interconstruidas ciertas variables que
son importantes para su funcionamiento. Por ejemplo la variable
PATH
contiene la lista de directorios donde serán buscados los
programas a ejecutar. Esta variable se define en el archivo de
configuración del shell actual5.1. Por ejemplo, lo más usual es que esta
variable esté prefijada con los siguientes valores:
$ echo $PATH :/bin:/usr/bin $
pero sabemos que existe el directorio /usr/games
donde se encuentran algunos juegos. En particular nos interesa
ejecutar el programa llamado fortune
que, man
lo sabe,
produce como salida una frase simpática. Pero acabamos de examinar el
contenido de la variable PATH
y claramente podemos observar que
el directorio /usr/games
no está incluido. Bueno ya sabemos
como incluirlo:
$ echo $PATH :/bin:/usr/bin $ PATH=$PATH:/usr/games $ echo $PATH :/bin:/usr/bin:/usr/games $
y como podemos observar los directorios van separados por
dos puntos, :
, esta es la manera tradicional para las variables
que contienen varios directorios de búsqueda, como veremos en la
sección .
Ahora estamos listos para ejecutar fortune
:
$ fortune Like so many Americans, she was trying to construct a life that made sense from things she found in gift shops. -- Kurt Vonnegut, Jr.
Para el manejo de las variables de entorno, necesitamos saber un poco de la sintáxis empleada en su definición. Habrá situaciones en que necesitaremos substituir el contenido de una variable dentro de una cadena o rodeado por algun tipo de carácteres:
$ prefijo=al $ echo ${prefijo}go algo $ echo cab${prefijo}go cabalgo
o quizá sea necesario utilizar el valor de una variable
previniendo el caso en que ésta no haya sido definida. Digamos que
necesitamos almacenar en una variable el nombre de un archivo, pero
que cuando este archivo no esté definido use por omisión el archivo
salida. Para este caso tenemos la construcción
${variable-valor_alterno}
:
$ echo ${donde-salida} salida $ donde=aqui $ echo ${donde-salida} aqui
Como podemos ver en la primera línea imprimimos el valor de
la variable donde
si está definida o si no el valor por omisión
salida
, que es el que obtenemos en la segunda línea. Después de
definir la variable donde
en la tercera línea, al preguntar por
ésta en la cuarta línea, obtenemos su definición en la quinta línea.
Existe también la opción de que en caso de que a la variable
se le asigne el valor por omisión en caso de que no esté
definida, con la construcción ${variable=valor_alterno}
:
$ echo ${donde=salida} salida $ echo $donde salida
Ejercicio: Dé una construcción alterna de éste ejemplo.
También se pueden utilizar la construcción
${variable?mensaje}
, donde si la variable no está definida,
imprime el mensaje dado y termina la ejecución del shell en que
fue invocada esta forma, o la forma alternativa
${variable+accion} en la cual si la variable está definida,
ejecuta la acción indicada, de otra forma no hace nada.
La tabla muestra las variables usuales del shell y su función.
La utilidad de las variables la veremos con mayor detenimiento en la sección donde construiremos algunos ejemplos interesantes. De momento, introduciremos la noción de subshell y ejecución de archivos de comandos.
En la sección de antecedentes mencionamos hasta el cansancio que lo que hace realmente poderoso a Unix es la filosofía con la que fue diseñado, es decir con la idea de que una colección de pequeños programas fuesen capaces de ser unidos por herramientas del sistema operativo con la finalidad de crear herramientas mayores o simplemente nuevas.
Introduciremos ahora los elementos para poder hacer esto. Como
recordaremos, cualquier archivo con instrucciones puede convertirse en
un archivo ejecutable con la instrucción chmod
. Ahora veremos
un pequeño ejemplo de un programa ejecutable. Como todavía no sabemos
como añadir permanentemente a nuestro ambiente el path donde
se encuentran los juegos, así que construiremos un pequeño programa
que llamaremos dichos
que añada el path y que ejecute
el programa fortune
. Al hacer ésto, lo que hacemos es pedirle
al shell que ejecute una copia de sí mismo donde interpretará
cada una de las instrucciones que le pedimos.
La secuencia siguiente es una de las que podemos utilizar para conseguir éste propósito:
$ cat > dichos PATH=$PATH:/usr/games fortune ^D $ ls -al dichos -rw-rw-rw- 1 pablo usuarios 30 Jun 13 02:46 dichos $ chmod ugo+rx dichos $ ls -al dichos -rwxr-xr-x 1 pablo usuarios 30 Jun 13 02:46 dichos $ dichos According to the latest official figures, 43% of all statistics are totally worthless. $ echo $PATH /bin:/usr/bin
Ejercicio: En el archivo dichos claramente estamos alterando el path. Pero en cuanto termina la ejecución y examinamos la variable, desaparece el directorio /usr/games. Puede explicar qué pasó?
Regresemos ahora a la tabla . Aparece una
palabra nueva en ella en la descripción de las variables PS1
y
PS2
: prompt, hasta ahora no la habíamos mencionado, aún
cuando ya estamos familiarizados con su significado. Simplemente es la
manera que tiene el shell de avisarnos que está listo para la
siguiente instrucción. En los ejemplos que hemos visto hasta ahora el
prompt ha estado indicado por $
, pero podemos cambiarlo
por lo que queramos alterando éstas variables. Podemos cambiarla, por
ejemplo, por:
$ PS1='Diga usted, amo: ' Diga usted, amo: date Tue Jun 13 03:08:31 CST 1995 Diga usted, amo: PS1='Listo para la otra: ' Listo para la otra: PS1='Ordene, maestro del universo: ' Ordene, maestro del universo: PS1='(\u@\h)\w:[\d]:\t$ ' (pablo@breogan)~/trabajo/programas:[Mon Apr 10]:03:55:45$
y un largo etcétera de posibilidades y adulaciones al ego. En el último caso, Pablo decide que quiere poner en su prompt el nombre del usuario, la máquina en la que esta conectado --muy útil cuando se trabaja en una red grande y desde cuentas diferentes--, el directorio donde se encuentra y la fecha y hora.