El informe que escribías cada lunes
Una tienda te manda cada semana un archivo con las visitas. Cada lunes escribes las mismas tres órdenes para ver qué día fue el más movido.
Un lunes te equivocas al escribirlas y mandas el día equivocado a tu responsable.
Quien trabaja bien escribe la tarea una vez, la guarda en un archivo y ejecuta el archivo.
Al final de esta lección
Nota
Puedo escribir y ejecutar un script de shell pequeño, y decir de qué paquete viene un programa.
Palabras clave
| Palabra | Qué significa | Ejemplo |
|---|---|---|
| Script | órdenes guardadas en un archivo, para ejecutarlas otra vez | |
| Shebang | la primera línea de un script, que dice qué programa lo lee | #!/bin/bash |
| Argumento | una palabra que escribes tras una orden y que la orden puede usar | $1 |
| Código de salida | un número que deja una orden: 0 quiere decir que fue bien | $? |
| Paquete | un programa y sus archivos, reunidos para que el sistema lo instale | |
| Gestor de paquetes | la herramienta que instala, actualiza y quita paquetes | apt |
Las celdas que rellenan los estudiantes quedan en blanco en esta vista previa.
Una tubería responde a una pregunta
El laboratorio guarda un archivo pequeño de visitas en /srv/lab-web/report.csv. Cada línea trae un día, una coma y una cifra. El archivo está en inglés.
cut -d, -f1 se queda con la primera columna. -d, dice que las columnas se separan con comas. tail -n +2 salta la línea del título. sort -t, -k2 -n -r ordena por la segunda columna, como números, de mayor a menor. head -n 1 se queda con la primera línea.
Saca la primera columna
cut -d, -f1 /srv/lab-web/report.csvSe muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.
Encuentra el día más movido
tail -n +2 /srv/lab-web/report.csv | sort -t, -k2 -n -r | head -n 1Se muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.
Un error frecuente
Advertencia
Mucha gente cree que sort ordena los números por tamaño. Por defecto ordena como texto: 98 va después de 175, porque 9 va después de 1. Sin -n, la tubería de arriba imprime Tuesday,98. Añade -n siempre que la columna sean números.
Un script son órdenes en un archivo
Un script es un archivo de texto con órdenes. La shell las ejecuta de arriba abajo, como si las escribieras tú.
La primera línea es el shebang. Dice qué programa lee el archivo. Una línea que empieza por # es un comentario, y la shell la salta.
Dentro de un script, $1 es la primera palabra que escribes tras su nombre. Así el script sirve para cualquier archivo.
Escribe el script en un archivo
printf '#!/bin/bash\n# Muestra el día más movido de un archivo CSV.\ntail -n +2 "$1" | sort -t, -k2 -n -r | head -n 1\n' > busiest.shSe muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.
Intenta ejecutarlo
./busiest.sh /srv/lab-web/report.csvSe muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.
Pide a bash que lo lea
bash busiest.sh /srv/lab-web/report.csvSe muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.
Permite que se ejecute
chmod +x busiest.shSe muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.
Ejecútalo
./busiest.sh /srv/lab-web/report.csvSe muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.
Cada orden deja un código de salida
Cuando una orden termina, deja un número. 0 quiere decir que fue bien. Cualquier otro número avisa de un problema.
$? guarda el número que dejó la última orden. Los scripts y cron lo usan para saber si un trabajo salió bien.
Una orden que falla
ls /nothere ; echo "codigo $?"Se muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.
El script que funciona
./busiest.sh /srv/lab-web/report.csv ; echo "codigo $?"Se muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.
Otro error frecuente
Advertencia
Mucha gente cree que un archivo que cat muestra también se ejecutará. Leer y ejecutar son permisos distintos. Un archivo nuevo no tiene la x para nadie. Escribe antes chmod +x, o pide a bash que lo lea.
El software llega en paquetes
En Ubuntu un programa llega como un paquete. El gestor de paquetes guarda la lista de lo instalado y de qué paquete es cada archivo.
dpkg lee esa lista. apt instala desde internet y necesita sudo. Con -s, apt-get install solo simula, así que se puede probar sin riesgo.
¿Dónde está el programa?
command -v curlSe muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.
¿Qué paquete es dueño de ese archivo?
dpkg -S /usr/bin/curlSe muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.
¿Está instalado el paquete?
dpkg -s curl | grep -E "^(Package|Status)"Se muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.
Simula instalarlo otra vez
apt-get install -s curl 2>&1 | tail -n 3Se muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.
Ejemplo: los verbos de apt
| Escribes | Qué hace | ¿Necesita sudo? |
|---|---|---|
| sudo apt update | Renueva la lista de lo que se puede instalar | Sí |
| sudo apt install htop | Instala un paquete y lo que necesita | Sí |
| sudo apt remove htop | Quita el paquete | Sí |
| apt-get install -s htop | Muestra qué haría una instalación, sin cambiar nada | No |
| dpkg -S /usr/bin/curl | Dice qué paquete es dueño de un archivo | No |
Las celdas que rellenan los estudiantes quedan en blanco en esta vista previa.
Para ir más lejos
Escríbelo tú, sin botones. Cambia el script para que imprima el día más tranquilo. ¿Qué opción quitas o añades?
Después busca la hora de cron que ejecutaría busiest.sh a las 07:30 cada lunes. En un servidor pondrías esa línea en /etc/cron.d, con el usuario antes de la orden.