|
| 1 | +# Introducción a scripting |
| 2 | + |
| 3 | +Cuando hablamos de _scripting_ en Linux por lo general nos referimos a _BASH scripting_ aunque en la realidad un script no es más que una serie de instrucciones ejecutadas por un itérprete y ese intérprete no tiene por que ser BASH. |
| 4 | + |
| 5 | +Cuando ejecutamos un script (o programa) Linux carga el contenido del script y sus instrucciones en memoria por lo que se crea un proceso que representa la instancia de ese programa. |
| 6 | + |
| 7 | +Por convención solemos darle una extensión específica para representar el lenguaje de su contenido como `.js`, `.py`, `.html` aunque para Linux las extensiones no son obligatorias para crear un fichero ejecutable. Sí es cierto que algunos entornos (e.j. GUI) sí asocian extensiones a programas para determinar cómo ejecutarlos. |
| 8 | + |
| 9 | +En este apartado nos centraremos en la shell BASH y BASH scripting |
| 10 | + |
| 11 | +## ¿Cómo ejecutar un script BASH? |
| 12 | + |
| 13 | +Vamos a crear el 'Hola mundo' en BASH. Para ello crearemos un fichero `helloworld` con el siguiente contenido: |
| 14 | + |
| 15 | +```bash |
| 16 | +echo "Hello world!" |
| 17 | +``` |
| 18 | + |
| 19 | +Para ejecutarlo un script en BASH, invocaremos al comando bash pasándole como argumento la ruta a nuestro script. Ejemplo: |
| 20 | + |
| 21 | +```shell |
| 22 | +$ bash ./helloworld |
| 23 | +Hello world! |
| 24 | +``` |
| 25 | + |
| 26 | +Otra opción es utilizar el _built in command_ `.` (dot) pasándole como argumento la ruta a nuestro script: |
| 27 | + |
| 28 | +```shell |
| 29 | +$ . ./helloworld |
| 30 | +Hello world! |
| 31 | +``` |
| 32 | + |
| 33 | +O incluso con el comando `source`: |
| 34 | + |
| 35 | +```shell |
| 36 | +$ source ./helloworld |
| 37 | +Hello world! |
| 38 | +``` |
| 39 | + |
| 40 | +Sí es cierto que en la práctica cuando invocamos algunos comandos no necesitamos anteponer su intérprete como, por ejemplo, el comando `egrep` que es otro BASH script. Esto es posible debido a dos motivos: |
| 41 | + |
| 42 | +- El script tiene **permisos de ejecución**. |
| 43 | +- El script sabe qué intérprete usar. |
| 44 | + |
| 45 | +Para poder hacer un script ejecutable necesitamos darle permisos de ejecución. En apartados posteriores veremos cómo funcionan el sistema de permisos en Linux. Por ahora para hacer nuestro script ejecutable haremos lo siguiente: |
| 46 | + |
| 47 | +```shell |
| 48 | +$ chmod +x ./helloworld |
| 49 | +``` |
| 50 | + |
| 51 | +Por último nos falta añadir el **_shebang_**. Es una instrucción que debe de ir al principio del fichero e indica el intérprete que debe de ejecutar. Se indica mediante `#!` seguido de la ruta absoluta del intérprete, en nuestro caso el intérprete es `/bin/bash`: |
| 52 | + |
| 53 | +```shell |
| 54 | +#!/bin/bash |
| 55 | + |
| 56 | +echo "Hello world!" |
| 57 | +``` |
| 58 | + |
| 59 | +Ahora podemos ejecutarlo sin el comando `bash` directamente mediante su ruta y nombre de archivo: |
| 60 | + |
| 61 | +```shell |
| 62 | +$ ./helloworld |
| 63 | +Hello world! |
| 64 | +``` |
| 65 | + |
| 66 | +Gracias a este _shebang_ podemos crear scripts no sólo de BASH si no de cualquier otro lenguaje interpretado, veamos un ejemplo en python creando el fichero `helloworld.py`: |
| 67 | + |
| 68 | +```py |
| 69 | +#!/usr/bin/python3 |
| 70 | + |
| 71 | +def say(message): |
| 72 | + print(message) |
| 73 | + |
| 74 | +say("Hello world from Python") |
| 75 | +``` |
| 76 | + |
| 77 | +Volvemos a darle permisos de ejecución y probamos su ejecución: |
| 78 | + |
| 79 | +```shell |
| 80 | +$ chmod +x ./helloworld.py |
| 81 | +$ ./helloworld.py |
| 82 | +Hello world from Python |
| 83 | +``` |
| 84 | + |
| 85 | +También es posible utilizar el comando `/usr/bin/env` pasándole el nombre del intérprete como argumento: |
| 86 | + |
| 87 | +```py |
| 88 | +#!/usr/bin/env python3 |
| 89 | + |
| 90 | +def say(message): |
| 91 | + print(message) |
| 92 | + |
| 93 | +say("Hello world from Python") |
| 94 | +``` |
| 95 | + |
| 96 | +Existen muchas variables que están preestablecidas al utilizar una shell BASH. Muchas de ellas son estáticas y unas pocas cambian conforme interactuamos con el sistema. Para ver el listado de todas las variables disponibles podemos utilizar el comando `env` sin argumentos. |
| 97 | + |
| 98 | +```shell |
| 99 | +$ env |
| 100 | +SHELL=/bin/bash |
| 101 | +LANGUAGE=en_US: |
| 102 | +PWD=/home/vagrant |
| 103 | +LOGNAME=vagrant |
| 104 | +XDG_SESSION_TYPE=tty |
| 105 | +MOTD_SHOWN=pam |
| 106 | +HOME=/home/vagrant |
| 107 | +LANG=C.UTF-8 |
| 108 | +... |
| 109 | +``` |
| 110 | + |
| 111 | +```shell |
| 112 | +$ echo Mi usuario es $USER |
| 113 | +Mi usuario es vagrant |
| 114 | +$ echo Mi usuario es USER |
| 115 | +Mi usuario es USER |
| 116 | +``` |
| 117 | + |
| 118 | +> También podemos utilizar el comando `printenv <varname>` para mostrar el contenido de una variable. Sin argumentos mostrará t |
| 119 | +
|
| 120 | +En apartados posteriores de _scripting_ veremos cómo trabajar con variables. |
0 commit comments