Que lo haga la máquina
Lo que escribes a mano cada día cabe en un archivo. Al terminar sabrás escribir un script robusto y programarlo para que corra solo.
Primero, la idea completa
Mira el video entero o salta a la parte que quieras repasar. Después, cada idea tiene su propia escena para tocarla.
Qué es un script
Un script es un archivo de texto con una lista de instrucciones que se ejecutan una tras otra, para automatizar tareas. Se puede ejecutar a mano, pero es común programarlo con cron o lanzarlo desde algún disparador externo.
Casi siempre se escriben en bash, por dos razones: bash está instalado en casi todos los sistemas Unix y Linux, así que el script correrá en cualquier lado, y hay muchísimos ejemplos. Suelen ser cortos y hacer una sola tarea concreta; si el script se vuelve largo o complejo, quizá convenga más Python o Ruby. Para escribirlos hace falta lo de la terminal (órdenes, redirecciones y variables) y, además, tipos de datos avanzados, estructuras de control, funciones y lectura de datos.
Ejecutar un script
- La extensión no importa para ejecutarlo, aunque por costumbre se usa
.sh. - Necesita permiso de ejecución. Como buena práctica se usa
chmod 750: todo para el dueño, leer y ejecutar para su grupo, nada para los demás. - La primera línea declara el intérprete: es el shebang, de la forma
#!intérprete [argumentos]. Empieza con#!, el espacio después es opcional, y el intérprete va con su ruta completa.
#!/bin/bash | ejecuta el archivo con bash |
#!/usr/bin/env perl | usa env para encontrar dónde está perl |
#!/usr/bin/python | ejecuta el archivo con Python |
El mismo archivo, hola.sh. Cambia su permiso, su shebang y la forma de llamarlo, y mira quién lo termina ejecutando.
Arreglos, control y funciones
- Arreglos: además de variables de un solo valor, un script puede guardar listas:
os=('Linux' 'macOS' 'Windows').${os[0]}es el primer elemento y${#os[@]}el número de elementos. - Ciclos:
for archivo in /tmp/*; do … donerecorre archivos,for i in {1..10}; do … donerecorre un rango ywhile true; do … donerepite hasta que algo lo detenga. - Condicionales:
if [ condición ]; then … else … fi. Dentro de los corchetes,-fpregunta si existe un archivo,-eqo-ltcomparan números y=compara texto. - Funciones:
decirhola() { echo "Hola $1"; }se llama condecirhola "Lucas"; los parámetros llegan en$1,$2… - Entrada:
read nombrelee una línea de stdin. Aun así, los scripts se suelen escribir para correr solos, sin que nadie escriba nada.
Ejecuta el script paso a paso. La línea resaltada es la que corre ahora.
Buenas prácticas
Un buen script evita guardar información sensible, sanea sus entradas y usa valores por defecto, revisa que sus dependencias existan, falla rápido, maneja los errores, está documentado, versionado y probado. Tres opciones de bash ayudan a fallar rápido:
set -o errexit | si una orden falla, el script se detiene |
set -o nounset | usar una variable no definida es un error |
set -o pipefail | si falla cualquier parte de una tubería, falla toda la tubería |
Y para los parámetros, un valor por defecto: primero="${1:-valorpordefecto}" usa el primer argumento, o el valor por defecto si no se pasó ninguno.
Este script tiene tres trampas: una copia que falla, una variable mal escrita y una tubería rota. Activa las opciones y mira hasta dónde llega.
Programar con cron
ampliación El demonio cron ejecuta órdenes a horas fijas. Cada usuario tiene su tabla, que se ve con crontab -l y se edita con crontab -e. Cada línea tiene cinco campos de tiempo y luego la orden:
| minuto | hora | día del mes | mes | día de la semana | orden |
|---|---|---|---|---|---|
| */5 | * | * | * | * | /home/ana/saludo.sh |
* significa «cualquiera» y */5 «cada 5». Esa línea ejecuta el script cada cinco minutos. Cron corre con un entorno mínimo, así que conviene usar rutas completas.
Antes de leer la respuesta
Tu turno: automatiza un saludo
Escribe un script que salude, con un nombre por defecto si no le pasas ninguno, y que deje cada saludo en un registro con la fecha del día, en /tmp/<fecha>/saludos.log. Después prográmalo para que cron lo ejecute cada cinco minutos y adelanta el reloj para comprobarlo.
Comprueba lo que entendiste
Cada respuesta incorrecta explica por qué parece correcta y en qué falla.