Scripts bash

En Windows se hace prácticamente todo sólo con el ratón, además es más fácil encontrar un programa o un plugin (de pago o pirateándolo) que hace mejor una tarea de una determinada manera con un click de ratón. El resultado de todo esto son unos usuarios acostumbrados a lo fácil, un sistema operativo que parece practicar el proselitismo de usuarios vagos… y conformistas porque las veces que no se encuentra una solución fácil se acostumbra a no hacer nada ya que el código fuente no está disponible. En linux se puede trabajar sólo con el ratón en las tareas normales, sin embargo para los usuarios más inquietos y en determinadas aplicaciones es fácil encontrar configuraciones en archivos de texto o comandos en el terminal, y, en general, muchas veces es necesario usar el teclado, lo que muchos usuarios de Windows consideran anticuado. Para los más expertos, sobre todo para los informáticos de las empresas con linux, se hace imprescindible saber programar scripts bash o programas escritos en el lenguaje de programación del intérprete de comandos más utilizado en linux, aunque no es necesario aprender todos sus posibilidades para sacar partido a bash.

Homer en el ordenador

En linux todo el código fuente y las herramientas de programación necesarias están a disposición de los usuarios. Los lenguajes de programación preferentes son C y C++, junto a las herramientas de desarrollo especificas para los dos escritorios más populares: Gnome y KDE, aparte están disponibles otros muchos lenguajes de programación más sencillos. Para la mayoría de aplicaciones son necesarias muchas horas y líneas de código, en linux se suele emplear el trabajo colaborativo a través de internet, en servidores de fácil acceso desde donde también podemos descargar la versión al día, si es software libre, o darnos de alta para colaborar junto con los demás desarrolladores de distintas nacionalidades. Otras veces, empresas o usuarios individuales aplican modificaciones al código fuente principal de un programa, si estos lo hacen público con licencias libres se incluyen para todos los usuarios en próximas versiones.

Para un usuario normal desarrollar o mejorar un programa se puede salir de sus conocimientos, por mucho que se oiga decir que linux es libre porque podemos cambiar el código. Esto más bien se debería entender por que tendríamos la posibilidad de hacerlo con unos conocimientos adecuados. Por otra parte no es necesario saber nada de programación para instalar otra versión de un programa ni para aplicar los cambios a los programas que hayan hechos otros usuarios más avanzados. No siempre es sencillo debido a incompatibilidades entre las versiones de las librerías instaladas y las utilizadas por el programador, o por la versión del compilador, a veces nos encontraremos con la imposibilidad de compilar un programa linux desde el código fuente, con avisos de errores poco legibles. En cualquier caso un usuario sin conocimientos podría encontrar en internet una guía fácil para la versión de su distribución.

Normalmente no es necesario compilar nada desde el código fuente, todos los paquetes básicos están ya compilados en los repositorios de cada distribución y en las distribuciones grandes los demás programas y las otras versiones de los programas se encuentran en repositorios no oficiales.

linux posee una filosofía muy modular, al menos lo es mucho más que Windows. En linux programas más básicos sirven de apoyo a los programas más grandes, es habitual tener que instalar más paquetes, aparte de los por defecto, para que todas las opciones de un programa funcionen. También podemos encontrar dos o más programas que funcionen, y fallen, igual porque se basen en los mismos comandos o paquetes comunes. En linux tienen más importancia que en Windows los programas en línea de comandos, sin depender de ventanas, pudiendo llegar a ser muy potentes, hasta el punto de caber la posibilidad de usar linux desde un terminal sin echar en falta casi nada (sobre todo en el modo framebuffer), esto es útil para los servidores de empresa, consume menos recursos y disminuye la posibilidad de errores, mientras que para los usuarios normales es conveniente familiarizarse con este modo de uso para el caso de un error del escritorio. Algunos programas linux en entornos gráficos son denominados front-end o GUI (interfaces gráficas de usuarios), poco más que cascarones de otros comandos para hacerlos más sencillos de utilizar.

Bash Scripting en el terminal de linux

En linux también es fácil ejecutar varias aplicaciones y comandos con los scripts de bash (el terminal más habitual en linux). Con los script podemos desde ejecutar dos comandos o programas a la vez hasta programar aplicaciones completas. Conociendo unos pocos comandos de bash podemos personalizar la ejecución de las aplicaciones, siendo lo más básico el comando sleep (esperar X segundos antes de continuar) y el símbolo & al final de un comando o programa (ejecuta o lanza el comando en segundo plano y continua con el siguiente… aunque también hay programas que continúan con la siguiente línea tengan o no & al final).

Nuestras posibilidades se multiplican sólo con algunos comandos más como read y echo, grep y sed, kill y pidof, las sentencias if-then, do-while y do-for, los símbolos >,< y >>, y las variables de errores y de entorno más comunes, aunque esto ya comenzaría a pertenecer a un nivel más avanzado.

Para crear un script tenemos que escribirlo (teniendo cuidado con las faltas de ortografía y los finales de línea) en un editor de texto, como gedit o kwrite, y cambiar los permisos del archivo para convertirlo en ejecutable con el comando chmod g+x o desde un administrador de archivos. Al ser un programa que entraría en la categoría de lenguaje interpretado no cambia su contenido al convertir el texto en ejecutable, con esto sólo lo marcamos con una etiqueta informativa para que el sistema operativo sepa el rango al que pertenece. Normalmente tienen la extensión .sh y se ejecutan con un doble click, en un icono de escritorio o desde un terminal con ./nombre_del_script.sh

Hola mundo en Bash

Que mejor que unos ejemplos para demostrar los beneficios de usar scripts bash:

*Al copiar y pegar texto de scripts de ejemplo, tanto de esta como de otras paginas web, hay que tener el cuidado de comprobar los espacios, finales de línea y caracteres poco comunes, ya que la web generalmente modifica el texto original por otro que provoca errores.

  • Si tenemos una tarjeta de televisión podríamos programar un script para las tardes de fútbol (es solo un ejemplo, no funcionará a menos de tener instalados los programas utilizados y estando configurados como los míos):

#!/bin/bash  # esta línea informa a linux de que el archivo es un script bash

# las líneas con el símbolo # al comienzo son comentarios opcionales que no se ejecutan

# lanzar el navegador firefox con la información y los marcadores en directo. Aquí & es necesario al final de la línea porque firefox no devuelve el control tras ser lanzado

firefox http://www.elpais.com/deportes/futbol/ &

# esperar 10 segundos para no saturar el procesador

sleep 10

# lanzar wxlc (vlc sin skins) con el canal tdt donde pongan los partidos, si está en primer lugar en el archivo de configuracion mis_canales.conf

/usr/bin/wxvlc /home/nombre_de_usuario/mis_canales.conf


  • Comandos para desmontar y montar particiones en un script que ejecutado como superusuario en un sistema utf8 cambia a modo escritura una partición (en este ejemplo es sda6) Windows NTFS de sólo lectura:

#si lanzamos el script desde un icono de escritorio podemos añadir el comando gksu antes de la ruta completa del script para que nos salga la ventana de contraseña de superusuario

#!/bin/bash

umount /dev/sda6
ntfs-3g /dev/sda6 /mnt/sda6


  • Con el siguiente script podemos convertir muchos tipos de archivos de vídeo a .mkv avisándonos con sonidos por si ha ocurrido un error (los sonidos .wav son a elección del usuario). Emplea una variable de error ($?) en una condición if-then y una variable argumento $1 que sería el nombre del archivo a convertir que se le pasa al script en la línea de comandos (únicamente un archivo en este caso):

#!/bin/bash

ffmpeg -i “$1” “$1”.mkv # en Ubuntu 14.04 LTS ffmpeg es avconv
if [ $? -eq 0 ]; then
aplay /home/nombre_de_usuario/mis_sonidos/chimes.wav
else
aplay /home/nombre_de_usuario/mis_sonidos/error.wav
fi


Este script es una plantilla que podemos adaptar a nuestros gustos, cambiando parámetros de ffmpeg, o modificando toda la primera línea. Se pueden añadir esta y otras funcionalidades a Konqueror, integrándolo en el menú del botón derecho del ratón de nuestro administrador de archivos favorito. La forma más sencilla de integrarlo en Konqueror es seleccionando un tipo de archivo, por ejemplo .flv> Pulsar botón derecho> Propiedades> Botón “Opciones de tipo de archivo”> “Añadir” en Orden de preferencias de aplicaciones> Ruta completa a nuestro script (debe tener el permiso de ejecutable) + espacio + %u (para pasar al script la ruta del archivo seleccionado) + “Ejecutar en terminal” y “No cerrar” (para información de progreso, errores y preguntas al intentar sobrescribir otro archivo existente).

  • Otros ejemplos más avanzados, un script para monitoreo de páginas web, siempre que no contengan elementos dinámicos que no interesen a nuestra vigilancia. El script utiliza condiciones if-then y do-while, más la variable de error $?, que contiene un valor de error de lo ejecutado anteriormente (en nuestros scripts bash también se puede informar de errores a otros scripts con exit n). Lo que hace este script probablemente se pueda hacer con otros programas linux de monitoreo de webs, aunque el programa wget ofrece muchas opciones y lo utilizaremos (en este ejemplo con las opciones más sencillas) junto con diff para avisarnos con un sonido y mostrar una pagina web cuando cambia el contenido de esta. Modificando las opciones de wget podemos monitorizar webs que devuelvan cookies, accesos con contraseñas, otros tipos de archivos junto con diff -a, etc:

#!/bin/bash

while [ $? -eq 0 ]; do

cp /home/nombre_de_usuario/nombre_pagina_wget.html /home/nombre_de_usuario/nombre_pagina_wget.back.html

wget -w 60 –random-wait -O /home/nombre_de_usuario/nombre_pagina_wget.html http://www.nombre_sitio.com/pagina_monitorizada.html

diff -q /home/nombre_de_usuario/nombre_pagina_wget.back.html /home/nombre_de_usuario/nombre_pagina_wget.html

if [ $? -eq 1 ]; then

firefox http://www.nombre_sitio.com/pagina_monitorizada.html &

aplay /home/nombre_de_usuario/mis_sonidos/mi_sonido.wav

fi

sleep 600 #10 minutos hasta nueva comprobación

done


  • En el caso de una página que incluya contenido dinámico que no nos interese monitorizar, como la hora, publicidad u otra información oculta intrascendente, seria necesario editar el texto descargado con comandos como sed. sed es muy completo y extenso, nos permite programar todo tipo de manipulaciones de texto. En los scripts también es muy común el símbolo “>”, con él la salida por pantalla del comando anterior se redirige al archivo que se especifique. En el siguiente ejemplo, tras comparar los archivos *_wget y *_wget.back del script anterior con el plugin de konqueror kdiff3 , se decide eliminar todas las líneas que contengan la palabra “comentario” y otras con contenido oculto javascript modificado por el servidor constantemente, evitando así los avisos falsos que nos estaba dando al comprobar cambios en una página web concreta. También corregiremos un error que ocurre cuando falla la conexión con el servidor:

#!/bin/bash

while [ $? -eq 0 ]; do

cp /home/nombre_de_usuario/nombre_pagina_wget.html /home/nombre_de_usuario/nombre_pagina_wget.back.html

wget -w 60 –random-wait -O /home/nombre_de_usuario/nombre_pagina_wget.html http://www.nombre_sitio.com/pagina_monitorizada.html

if [ -s /home/nombre_de_usuario/nombre_pagina_wget.html ]; then #comparar sólo si la página descargada tiene un tamaño mayor que cero

sed ‘/<!–/d’ /home/nombre_de_usuario/nombre_pagina_wget.html > /home/nombre_de_usuario/nombre_pagina_swget.html #utilizar archivo intermedio *_swget para evitar el error de sed con el archivo que está editando

sed ‘/comentario/d’ /home/nombre_de_usuario/nombre_pagina_swget.html > /home/nombre_de_usuario/nombre_pagina_wget.html

diff -q /home/nombre_de_usuario/nombre_pagina_wget.back.html /home/nombre_de_usuario/nombre_pagina_wget.html

if [ $? -eq 1 ]; then

firefox http://www.nombre_sitio.com/pagina_monitorizada.html &

aplay /home/nombre_de_usuario/mis_sonidos/mi_sonido.wav

fi

else

cp /home/nombre_de_usuario/nombre_pagina_wget.back.html /home/nombre_de_usuario/nombre_pagina_wget.html #restaurar la última descarga no fallida

fi

sleep 600 #10 minutos hasta nueva comprobación

done


En el script se pueden eliminar otros errores que puedan surgir y mejorarlo, dentro de lo posible, con una configuración flexible y universal, para que funcione para todos los usuarios y con cualquier página web, hasta alcanzar el nivel de una aplicación pública.

Aunque bash sea incompleto como lenguaje de programación, y tampoco sería aconsejable si se busca la rapidez del código propio, es perfectamente válido en determinadas circunstancias. En los scripts bash se pueden hacer llamadas a algunas librerías y aplicar varios GUIs opcionales muy sencillos de programar, incluso se pueden utilizar GUIs o front-ends completos utilizados para otros lenguajes de programación, dando el pego de programa normal.

Los usuarios normales pueden llegar a hacer muchas cosas apoyándose en unos pocos comandos bash y en los programas normales, linux parece incitar a programar scripts ya que la gran mayoría de los programas aceptan opciones en la línea de comandos y linux está diseñado para poder funcionar también en un terminal de texto. No es necesario dominar a gran nivel los scripts bash para personalizar nuestro linux, y para preguntarse por qué en Windows los scripts son prácticamente desconocidos.

Anuncios

Un comentario sobre “Scripts bash

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s