Pixelaula.
Shell y archivos · Lección 3 de 5

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.

⏱ 30–40 min▶ Video de 79 s🧪 Laboratorio con 4 misiones
00 · En 79 segundos

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.

    01 · Órdenes en un archivo

    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.

    02 · La primera línea

    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/bashejecuta el archivo con bash
    #!/usr/bin/env perlusa env para encontrar dónde está perl
    #!/usr/bin/pythonejecuta el archivo con Python
    Escena 1

    El mismo archivo, hola.sh. Cambia su permiso, su shebang y la forma de llamarlo, y mira quién lo termina ejecutando.

    03 · Las piezas

    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 … done recorre archivos, for i in {1..10}; do … done recorre un rango y while true; do … done repite hasta que algo lo detenga.
    • Condicionales: if [ condición ]; then … else … fi. Dentro de los corchetes, -f pregunta si existe un archivo, -eq o -lt comparan números y = compara texto.
    • Funciones: decirhola() { echo "Hola $1"; } se llama con decirhola "Lucas"; los parámetros llegan en $1, $2…
    • Entrada: read nombre lee una línea de stdin. Aun así, los scripts se suelen escribir para correr solos, sin que nadie escriba nada.
    Escena 2

    Ejecuta el script paso a paso. La línea resaltada es la que corre ahora.

    04 · Que falle a tiempo

    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 errexitsi una orden falla, el script se detiene
    set -o nounsetusar una variable no definida es un error
    set -o pipefailsi 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.

    Escena 3

    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.

    05 · Que corra solo

    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:

    minutohoradía del mesmesdía de la semanaorden
    */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.

    06 · Predice

    Antes de leer la respuesta

    Laboratorio

    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.

    Repaso

    Comprueba lo que entendiste

    Cada respuesta incorrecta explica por qué parece correcta y en qué falla.