Página siguiente Página anterior Índice general

7. Miscelánea

Todo lo que se necesita para empezar a investigar y para despertar tu interés (si a estas alturas la programación en shell no ha despertado tu interés, dudo que lo haga) ya se ha visto. Lo único que queda son decir algunas cosas más, y decir que si crees que le falta algo de potencia, que te mires algún libro. Hay algunas cosas que yo no he querido poner en este documento, como por ejemplo atrapar las señales del sistema, una orden para manejar los parámetros estilo UNIX (es decir, con - al principio, y pudiendo agrupar -l -F en -lF), y otras cosas.

7.1 Variables útiles de entorno

En los programas muchas veces es útil consultar las variables de entorno. Por ejemplo, el usuario puede tener definido su editor preferido enla variable $EDITOR. Así, si necesitamos editar un texto, podemos llamar al editor que ponga la variable $EDITOR, en vez de coger el que a nosotros nos dé la gana (ya se sabe, la guerra santa vi-emacs, en la que por cierto soy defensor del vi, hace estragos). Algunas variables útiles de entorno son:

     Variable        Significado
       $PS1          Aspecto del apuntador (prompt) principal
       $PS2          Aspecto del apuntador (prompt) secundario
       $PWD          Directorio actual
       $HOME         Directorio home del usuario que ejecuta el proceso
       $USER         Nombre de login del usuario que ejecuta el proceso
        $$           PID del proceso
       $PATH         Ruta de búsqueda del usuario actual

El apuntador, como probablemente sabes, es lo que sale a la izquierda de la pantalla cuando escribes cosas. En una terminal UNIX, probablemente sea `$' en Linux seguramente es algo más complicado.

A lo mejor lo que no sabes es qué diablos es el apuntador secundario. Cuando escribes comillas (de cualquier tipo) en la línea de órdenes, pero pulsas Enter antes de terminar de escribir lo que tenías entre comillas (es decir, si abres comillas pero no las cierras), el intérprete enseñará el apuntador secundario en la siguiente línea, y seguirá poniendo apuntadores secundarios en las líneas subsiguientes hasta que cierres las comillas.

El PID de un proceso es su process id. Es un número que sirve para identificar al proceso (cuando haces un kill y similares). Este número es evidentemente único para cada proceso, y lo podemos utilizar para crear ficheros en el directorio /tmp únicos para esa interpretación del guión. Piensa que si tuviéramos a dos usuarios diferentes ejecutando el mismo guión a la vez, uno de ellos machacaría algún hipotético fichero temporal que pudiera tener el primero, y se formaría un pollo que no veas.

Algo a tener en cuenta cuando estemos programando apoyándonos en variables de entorno, es que estas variables no se pueden modificar. Podemos asignarles valores y cambiarán, pero sólo en nuestro programa. Hay que tener en cuenta que $PWD, que es la variable que controla el directorio actual, no tiene nada que ver con el núcleo del sistema operativo, es un problema exclusivo del intérprete, que es al fin y al cabo la interfaz para que el usuario se comunique con el sistema operativo. Así, si escribimos un guión que cambie el directorio actual, aunque sea mediante la orden cd, al salir del guión del intérprete ni se habrá enterado.

7.2 Ejecución en el mismo inérprete (shell)

El hecho de que nosotros modifiquemos una copia de las variables es por el hecho de que los guiones se ejecutan en otro intérprete diferente al actual, y entonces las variables de entorno simplemente se copian. Para que se copien, debemos exportar las variables. Todas las variables normales ya están exportadas en el fichero de configuración (ya sea en el general o en el de cada usuario), pero quizás algunas variables inventadas por nosotros o poco comunes queremos que sean exportadas también, para que cualquier otro programa pueda acceder a ellas para consultarlas.

La manera de forzar esto es con la orden export. La sintaxis es, simplemente, export variable. Por ejemplo, export EDITOR.

Pero nosotros hablábamos de ejecutar programas en el intérprete actual, entre otras cosas para poder modificar variables de entorno. La forma de hacer esto, es poner un punto (.) antes del nombre del programa. Por ejemplo, escribir . inicializacion.

7.3 Referirse a variables

Cuando vimos la forma de referirse a los parámetros, salió el delicado tema de que sólo podíamos referirnos a los parámetros que estén en las primeras nueve posiciones. Esto es así en el Bourne Shell, y se debe actuar así si se quiere hacer un guión estándar que se ejecute en cualquier sitio. Pero en el Korn Shell (y creo que también en bash, aunque no lo he probado) se pueden escribir los nombres de variables con esta sintaxis: ${variable}. El Bourne Shell acepta esta construcción cuando son variables normales, pero no cuando lo utilizamos para indicar parámetros.

Así, el Korn Shell y compatibles, podríamos referirnos al parámetro 15 con la expresión ${15}. En cualquier inérprete compatible con el bourne, si quisiéramos escribir caracteres justo después del contenido de una variable, deberíamos escribir, por ejemplo:

        ${foo}bar

Porque si pusiéramos simplemente

        $foobar

El intérprete creería que nos referimos a una variable no declarada llamada foobar, con lo que esa expresión sería una ristra vacía.

7.4 La orden eval

Hay una orden que algunas veces nos puede sacar de algunos apuros: es la orden eval. En realidad esta orden no sirve para nada, simplemente, al ser una orden (como parámetros tenemos que poner otra orden), fuerza que el intérprete pase dos veces por el mismo sitio, y que evalúe dos veces la expresión. Así, si quisiéramos que el usuario introdujera por teclado el nombre de una variable a modificar, podríamos resolver el problema así:

        read nombre
        eval $nombre=10

La primera vez que el intérprete lo mirara, la expresión de eval quedaría como `[contenido de la variable $variable]=10'. La segunda vez, ejecutaría la orden, como quedara, con lo que conseguiríamos asignar 10 a una variable cuyo nombre ha sido elegido por el usuario.


Página siguiente Página anterior Índice general