educación, informática y demás

2405 - Scripts GNU/Linux

GNU Bash Shell Script. Primeros pasos

Bash es un interprete de comandos que habitualmente se utiliza de forma general en las distribuciones de GNU/Linux y más concretamente en las distribuciones basadas en Debian.

Para lanzar una terminal con Bash en Debian 12 XFCE4 podemos pulsar CTRL+ALT+T.

En la imagen aparece el cursor como un cuadro en blanco y a la izquierda el prompt del sistema (si quieres más información al respecto, puedes consultar los contenidos sobre SS.OO. en este mismo sitio web). Por defecto, el prompt está compuesto por la siguiente información:

  • Nombre de usuario actual.
  • Nombre de la máquina actual, es decir en la que estamos trabajando ahora.
  • Ruta del directorio de trabajo o directorio actual.
  • Tipo de usuario. $ indica que es un usuario normal y # indica que el usuario es root.

Podemos ejecutar comandos y aplicaciones desde la shell. Para ello, escribimos el nombre del comando.

Si queremos información de un comando consultamos su página de manual

Para salir de la página de manual pulsamos q.

Un comando es un programa. Al escribir su nombre en el interprete de comandos, éste lo busca en memoria (si es un comando interono) o en el sistema de ficheros. La duda aquí es, primero dónde esta el comando ls y segundo como sabe la shell dónde está alojado el fichero que contiene el comando ls.

Vamos a resolver la primera duda, ¿dónde está ls?

Podemos utilizar el comando whereis para localizar ficheros de un comando o aplicación.

La segunda pregunta es, ¿cómo sabe bash dónde está el fichero binario o ejecutable de ls?

Casi todos los sistemas operativos de escritorio utilizan una variable de entorno especial llamada PATH que contiene una lista ordenada de rutas de directorios en los que el interprete de comandos va a buscar el comando o aplicación que quiera ejecutar el usuario. Siguiendo ese orden, en cuanto encuentre la aplicación que coincida con el nombre de comando o aplicación escrita por el usuario en el interprete, la ejecutará y dejará de buscar.

Si no la encuentra, entonces muestra un mensaje de error indicando que no encuentra dicho comando o aplicación.

Vamos a ver el contenido de la variable PATH

Nos está mostrando el contenido de la variable PATH que se supone que es una lista de rutas de directorios. Para separar las rutas de la lista el sistema utiliza el caracter : como separador. De esta forma tenemos las siguientes rutas ordenadas:

  • /usr/local/bin
  • /usr/bin
  • /bin
  • /usr/local/games
  • /usr/games

¿Qué sucede si no encuentra el fichero a ejecutar?. Mostrará un mensaje de erro

Como es lógico, no existe un comando o aplicación llamado holaMundo.sh, aunque la crearemos en el siguiente apartado.

Por último, también podemos ejecutar aplicaciones, tanto en modo texto como en modo gráfico.

Por ejemplo, vamos a lanzar la aplicación nano.

Se abre el editor de textos.

Podemos pasarle parámetros a los programas. En este caso, podemos pasarle por parámetro a nano la ruta del fichero de texto plano que queremos abrir para editarlo. Si el fichero no existe, nos dará la oportunidad de crearlo al guardar el buffer. Si no guardamos, el fichero no se creará.

Como el fichero no existe, nos deja un buffer o contenido en memoria del fichero vacío.

Escribimos código en nuestro fichero

Al salir, detecta que hemos modificado y nos pregunta si queremos guardar.

Al contestar con S nos da directamente la ruta del fichero que le hemos pasado por parámetro al lanzar la aplicación.

Pulsamos Enter y se guardará. Vamos a mostrar el contenido del fichero.

Como hemos comentado antes, también podemos lanzar aplicaciones gráficas, siempre y cuando estemos en un entorno de escritorio, desde una terminal en modo gráfico.

Esto abrirá la aplicación mousepad y le pasa por parámetro la ruta del fichero holaMundo.sh.

Bash está ejecutando mousepad y no nos va a hacer caso. Hasta que no termine la aplicación mousepad, el proceso de bash está ocupado con esta aplicación. Podríamos haber lanzado la aplicación en segundo plano para permitir al usuario seguir trabajando con bash.

Vamos a probar a lanzar otra aplicación, en este caso firefox.

Código de retorno de la aplicación

Cuando una aplicación o comando termina de ejecutarse siempre devuelve un número entero como código de salida. Este número no se muestra al usuario, pero se puede consultar dentro del código de un shell script. La variable que contiene este código es $?. Vamos a probarla

Si el comando o aplicación se ha ejecutado correctamente, debería devolver un valor 0.

Si el comando o aplicación se NO se ha ejecutado correctamente, devolverá un valor distintos de 0.

El número que devuelve nos puede indicar el tipo de error que se ha producido. Para saberlo deberíamos consultar el manual o documentación de la aplicación.

Lanzando aplicaciones en segundo plano

Habrá ocasiones en las que nos interese lanzar una aplicación y seguir ejecutando comandos, es decir no quedar a bash a la espera de que termine la aplicación a ejecutar. Para ello, podemos ejecutarla en segundo plano con el caracter &.

Esto hará que bash cree un nuevo proceso que se encargará de ejecutar la aplicación. Cuidado, porque esta aplicación no tendrá una entrada asignada. Ahora veremos el problema que puede generar.

Si ejecutamos se abrirá la aplicación mousepad en otro proceso distinto, lo cual permitirá que podamos seguir trabajando con bash.

El número que se muestra es el PID del proceso creado para ejecutar mousepad. Este proceso es un proceso hijo del proceso bash que lo ha ejecutado. Esto implica que, si cerramos esta terminal se cerrará la aplicación mousepad también.

Además podemos seguir ejecutando comandos si queremos. Aparece una nueva línea con el cursor a la espera de que el usuario inserte nuevos comandos.

Vamos a buscar el proceso que está ejecutando el mousepad.

Vamos a crear nuestro script 🙂

Realmente ya hemos creado una primera versión de nuestro primer script.

En todo bash shell script que nosotros creemos vamos a iniciarlo con una cadena de texto especial.

Esta cadena de texto comienza por el caracter # seguido por ! y una ruta.

Esta cadena de texto es especial y es interpretada por el interprete de comandos bash de la siguiente forma:

  • Tengo que ejecutar el script que está a continuación con el interprete de comandos cuya ruta me has proporcionado en #!/ruta/al/interprete

Como nosotros vamos a crear un script que será ejecutado por bash, lo que vamos a escribir será el código especial #! seguido de la ruta del inteprete de comandos bash que es /bin/bash.

Pues vamos a añadir esta primera línea.

Guardamos y, sin cerrar mousepad, puesto que no es necesario y vamos a seguir editando, nos cambiamos a la ventana de terminal. Ahora vamos a ejecutar el script.

No se ha ejecutado, y de hecho nos dice que no lo encuentra, porque bash ha buscado un ejecutable con el hombre holaMundo.sh en los directorios del PATH. Ahí no está, está en el directorio actual. Así que se lo vamos a indicar expresamente, que ejecute el fichero ./holaMundo.sh

El fichero no tiene permiso de ejecución, por tanto no podemos ejecutarlo. Vamos a darle permiso de ejecución solo al usuario propietario y al grupo, al resto no, cuidado, manteniendo los permisos que ya tenga.

Ahora lo ejecutamos

Vamos a completar el script siguiendo unas recomendaciones (obligatorias para nosotros) acerca de los comentarios en los scripts.

Siempre incluimos descripción, autor con medio de contacto y fecha de creación o última modificación.

Resaltado de sintaxis

Se trata de una característica que tienen los editores de texto que están preparados para trabajar con lenguajes de programación y que a nosotros, los humanos nos viene muy bien.

En el caso de mousepad tenemos que activar la combinación de colores.

El propio editor de texto, habitualmente gracias a la extensión del fichero, detecta el tipo de lenguaje de programación que estamos usando y nos muestra resaltado de sintaxis.

El resaltado de sintaxis consiste en mostrar con colores y tipografías diferentes palabras clave reconocidas.

Si por un casual mousepad no detecta el lenguaje de programación utilizado para mostrar la sintaxis o lo detecta regular, podemos configurar el tipo de lenguaje de programación para el que queremos que se realice el resaltado de sintaxis.

Ejercicio 01

Crea un script que muestre en pantalla la ruta del directorio actual seguida de un listado de todos los ficheros con extensión txt.

showDocs.sh

Si tenemos dudas acerca de cómo usar un comando o si el comando en cuestión es el que necesitamos podemos utilizar una terminal para comprobar.

El código nos quedaría así:

El código funciona, pero no me gusta que aparezca ese mensaje de error.

No queremos que aparezca mensaje de error. La solución simple es redirigir solo la salida de errores a /dev/null.

Veamos ahora

Claro, como no hay ficheros no sabemos, bueno si lo sabemos porque sabemos de esto, si funciona o no el script.

Dejar una respuesta