lunes, 2 de octubre de 2017

Escribiendo tu Primer Script

En los capítulos precedentes, hemos reunido un arsenal de herramientas de línea de comandos. Aunque estas herramientas pueden resolver muchos tipos de problemas de computación, todavía estamos limitados a usarlas manualmente una a una en la línea de comandos. ¿No sería genial si pudiéramos usar el shell para hacer la mayoría del trabajo? Podemos. Poniendo nuestras herramientas juntas en programas diseñados por nosotros, el shell puede ejecutar secuencias completas de tareas por sí mismo. Podemos permitirle que haga esto escribiendo scripts de shell.

¿Que son scripts de shell?

En términos sencillos, un script de shell es un archivo que contiene una serie de comandos. El shell lee este archivo y ejecuta los comandos tal como han sido introducidos directamente en la línea de comandos.

El shell es algo único, en cuanto a que es una interfaz poderosa de línea de comandos para el sistema y un intérprete de lenguaje de script. Como veremos, la mayoría de las cosas que pueden hacerse con la línea de comandos puede hacerse con scripts, y la mayoría de las cosas que pueden hacerse con scripts pueden hacerse en la línea de comandos.

Hemos visto muchas características del shell, pero nos hemos enfocado en aquellas más usadas directamente en la línea de comandos. El shell también proporciona una serie de características que normalmente (aunque no siempre) se usan cuando escribimos programas.

Cómo escribir un script de shell

Para crear con éxito y ejecutar un script de shell, necesitamos hacer tres cosas:


  1. Escribir un script. Los scripts de shell son normalmente archivos de texto. Así que necesitamos un editor de texto para escribirlos. Los mejores editores de texto proporcionarán destacado sintáctico, permitiéndonos ver una vista coloreada del código de los elementos del script. El destacado sintáctico nos ayudará a encontrar algunos tipos de errores comunes. vim, gedit, kate y muchos otros editores son buenos candidatos para escribir scripts.
  2. Hacer el script ejecutable. El sistema es un poco quisquilloso en no dejar que ningún antiguo archivo de texto sea tratado como un programa, y ¡Es por una buena razón! Necesitamos dar permisos al archivo del script para que se permita la ejecución.
  3. Poner el script en algún lugar donde el shell pueda encontrarlo. El shell automáticamente busca archivos ejecutables en ciertos directorios cuando no se especifica una ruta concreta. Para mayor comodidad, colocaremos nuestros scripts en dichos directorios
Formato del archivo de script

Siguiendo la tradición de la programación, crearemos un programa "hola mundo" para demostrar un script tremendamente simple. Así que arranquemos nuestros editores de texto e introduzcamos el siguiente script:

#!/bin/bash


# This is our first script.


echo 'Hello World!'


La última línea de nuestro script es muy familiar, sólo un comando echo con una cadena de argumentos. La siguiente línea también es familiar. Parece un comentario que hemos visto usado en los archivos de configuración que hemos examinado y editado. Una cosa sobre los comentarios en scripts de shell es que también pueden aparecer al final de las líneas, así:

 echo 'Hello World!' # This is a comment too

Todo lo que hay desde el símbolo # en adelante en la línea es ignorado.

Como muchas cosas, ésto funciona en la línea de comandos también:

 [me@linuxbox ~]$ echo 'Hello World!' # This is a comment too
 Hello World!

Aunque los comentarios son poco útiles en al línea de comandos, también funcionan.

La primera línea de nuestro script es un poco misteriosa. Parece como si fuera un comentario, ya que comienza con #, pero parece demasiado significativa para ser sólo eso. La secuencia de caracteres #! es, de hecho, una construcción especial llamada un shebang. El shebang se usa para decirle al sistema el nombre del intérprete que debería usarse para interpretar el script que sigue. Cada script de shell debería incluirlo en su primera línea.

Guardemos nuestro archivo de script como hello_world.

Permisos de ejecución

Lo siguiente que tenemos que hacer es hacer nuestro script ejecutable. Ésto se hace fácilmente usando chmod:

 [me@linuxbox ~]$ ls -l hello_world
 -rw-r--r-- 1 me  me          63 2009-03-07 10:10 hello_world
 [me@linuxbox ~]$ chmod 755 hello_world
 [me@linuxbox ~]$ ls -l hello_world
 -rwxr-xr-x 1 me  me          63 2009-03-07 10:10 hello_world

Dos configuraciones comunes de permisos para los scripts; 755 para scripts que puede ejecutar todo el mundo, y 700 para scripts que sólo puede ejecutar el propietario. Fíjate que los scripts deben ser legibles para ser ejecutados.


Localización del archivo de script

Con los permisos establecidos, ahora podemos ejecutar nuestro script:

 [me@linuxbox ~]$ ./hello_world
 Hello World!

Para que el script funcione, debemos preceder el nombre del script con una ruta específica. Si no lo hacemos, obtenemos ésto:

 [me@linuxbox ~]$ hello_world
 bash: hello_world: command not found

¿Qué es ésto? ¿Qué hace que nuestro script sea diferente de otros programas? Al parecer, nada. Nuestro script está perfecto. El problema es su localización. Volviendo al capítulo 11, vimos la variable de entorno PATH y su efecto en cómo busca el sistema los programas ejecutables. Para abreviar, el sistema busca en una lista de directorios cada vez que necesita encontrar un programa ejecutable, si no se especifica una ruta concreta. Así es como el sistema sabe que tiene que ejecutar /bin/ls cuando escribimos ls en la línea de comandos. El directorio /bin es uno de los directorios donde el sistema busca automáticamente. La lista de directorios está contenida en una variable de entorno llamada PATH. La variable PATH contiene una lista separada por dos puntos de los directorios donde buscar. Podemos ver el contenido de PATH:

[me@linuxbox ~]$ echo $PATH
/home/me/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games

Aquí vemos nuestra lista de directorios. Si nuestro script estuviera localizado en cualquiera de los directorios de la lista, nuestro problema estaría solucionado. Fíjate en el primer directorio de la lista, /home/me/bin. La mayoría de las distribuciones Linux configuran la variable PATH para contener un directorio bin en el directorio home del usuario, para permitir a los usuarios ejecutar sus propios programas. Así que si creamos el directorio bin y colocamos nuestro script en él, debería comenzar a funcionar como otros programas:

 [me@linuxbox ~]$ mkdir bin
 [me@linuxbox ~]$ mv hello_world bin
 [me@linuxbox ~]$ hello_world
 Hello World!

Y así lo hace.

Si la variable PATH no contiene el directorio, podemos añadirlo fácilmente incluyendo esta línea en nuestro archivo .bashrc:

 export PATH=~/bin:"$PATH"


Después de hacer este cambio, tendrá efecto en cada nueva sesión de terminal. Para aplicar el cambio a la sesión de terminal actual, tenemos que hacer que el shell relea el archivo .bashrc. Esto puede hacerse mediante el comando source:

 [me@linuxbox ~]$ . .bashrc

El comando punto ( . ) es un sinónimo del comando source, una función del shell que lee un archivo específico de comandos de shell y lo trata como entrada del teclado.

Nota: Ubuntu añade automáticamente el directorio ~/bin a la variable PATH si el directorio ~/bin existe cuando el archivo .bashrc del usuario se ejecute. Así que, en sistemas Ubuntu, si creamos el directorio ~/bin y luego salimos y volvemos a entrar, todo funciona.


Buenas localizaciones para los scripts

El directorio ~/bin es un buen lugar para colocar scripts destinados a uso personal. Si escribimos un script que todo el mundo en el sistema está autorizado a usar, la localización tradicional es /usr/local/bin. Los scripts destinados al uso del administrador del sistema se localizan a menudo en /usr/local/sbin. En la mayoría de los casos, el software proporcionado localmente, ya sean scripts o programas compilados, debería localizarse en la jerarquía de /usr/local y no en /bin o /usr/bin. Estos directorios son especificados por el Estándar de Jerarquía del Sistema de Archivos de Linux para contener sólo archivos proporcionados y mantenidos por el distribuidor Linux.


Más trucos de formateado

Uno de los objetivos clave de una escritura seria de scripts es que sean fáciles de mantener; o sea, la facilidad con la que un script puede ser modificado por su autor u otros para adaptarlo a cambios necesarios. Hacer que un script sea fácil de leer y comprender es una forma de facilitar un mantenimiento sencillo.


Nombres opción largos

Muchos de los comandos que hemos estudiado cuentan tanto con nombres cortos como largos para las opciones. Por ejemplo, el comando ls tiene muchas opciones que pueden expresarse tanto en forma corta como larga. Por ejemplo:

 [me@linuxbox ~]$ ls -ad

y:

 [me@linuxbox ~]$ ls --all --directory

son comandos equivalentes. En interés de reducir la escritura, preferimos las opciones cortas cuando incluimos opciones en la línea de comandos, pero cuando escribimos scripts, las opciones largas pueden proporcionar una legibilidad mejor.


Identación y continuación de líneas

Cuando empleamos comandos largos, la legibilidad puede mejorarse separando el comando en varias líneas. En el capítulo 17, vimos un ejemplo particularmente largo del comando find:

[me@linuxbox ~]$ find playground \( -type f -not -perm 0600 -exec chmod 0600 ‘{}’ ‘;’ \) -or \( -type d -not -perm 0700 -exec chmod
0700 ‘{}’ ‘;’ \)


Obviamente, este comando es un poco complicado de descifrar a primera vista. En un script, este comando podría ser más fácil de comprender si está escrito de esta forma:

find playground \
   \( \
         -type f \
         -not -perm 0600 \
         -exec chmod 0600 ‘{}’ ‘;’ \
   \) \
   -or \
   \( \
         -type d \
         -not -perm 0700 \
         -exec chmod 0700 ‘{}’ ‘;’ \
   \)

Usando continuaciones de línea (secuencias barra invertida-salto de línea) e indentación, la lógica de este comando complejo se describe más claramente para el lector. Esta técnica funciona en la línea de comandos, también, aunque raramente se utiliza, ya que es muy incómodo de escribir y editar. Una diferencia entre un script y la línea de comandos es que el script puede emplear caracteres de tabulación para realizar indentación, mientras que la línea de comandos no puede, ya que el tabulador se usa para activar el completado.

Configurando vim para escribir scripts

El editor de texto vim tiene muchas, muchas posibilidades de configuración. Hay varias opciones comunes que pueden facilitar la escritura de scripts:

:syntax on

activa el destacado sintáctico. Con esta configuración, diferentes elementos de la sintáxis del shell se mostrarán en colores diferentes cuando veamos un script. Esto es útil para identificar ciertos tipos de errores de programación. Se ve más chulo, también. Fíjate que para que esta característica funcione, debes tener una versión completa de viminstalada, y el archivo que estés editando debe tener un shebang indicando que el archivo es un script de shell. Si tienes dificultades con el comando anterior, prueba :set syntax=sh en su lugar.

:set hlsearch

activa la opción de destacar los resultados de búsqueda. Digamos que buscamos la palabra "echo." Con esta opción activada, cada instancia de la palabra será destacada.

:set tabstop=4

establece el número de columnas ocupadas por un carácter tabulador. Por defecto son 8 columnas. Estableciendo el valor a 4 (que es una práctica común) permite a las líneas largas ajustarse más fácilmente a la pantalla.

:set autoindent

activa la función "auto indentado". Esto hace que vim indente una nueva línea la misma cantidad que la línea recién escrita. Esto acelera la escritura en muchos tipos de construcción de programas. Para detener la indentación, pulsa Ctrl-d.

Estos cambios pueden hacerse permanentes añadiendo estos comandos (sin los dos puntos delante) a tu archivo ~/ .vimrc.


Resumiendo

En este primer capítulo sobre scripting, hemos visto cómo se escriben los scripts y como se hace para que se ejecuten fácilmente en nuestro sistema. También vimos como podemos usar varias técnicas de formateo para mejorar la legibilidad (y por lo tanto, el mantenimiento) de nuestros scripts. En capítulos posteriores, la facilidad de mantenimiento volverá una y otra vez como un principio central en una buena escritura de scripts.

Para saber más

No hay comentarios:

Publicar un comentario

Nota: solo los miembros de este blog pueden publicar comentarios.