~/nube/p00 $ cat 02-shell-en-debian.md
- Introducción a la nube pública
- P00
- lección 02/06
Shell
Opera y automatiza tareas pequeñas sobre el espacio de trabajo compartido desde Bash en Debian.
Qué es la shell y por qué la usamos aquí
Section titled “Qué es la shell y por qué la usamos aquí”La terminal es la ventana en la que escribes; la shell es el programa que interpreta las órdenes que escribes en esa ventana. En este curso la shell será Bash dentro del contenedor Debian. Por eso las prácticas serán iguales para quien use Windows y para quien use Linux en el equipo anfitrión.
Una orden suele tener esta forma:
comando [opciones] [argumentos]Por ejemplo, en ls -la /optativa-nube, ls es el comando, -la son opciones y /optativa-nube es el argumento que indica qué carpeta se quiere listar. No memorices órdenes aisladas: identifica primero qué quieres averiguar o cambiar y comprueba el resultado después.
El prompt termina normalmente en $ cuando trabaja un usuario ordinario y en # cuando se usa una cuenta administrativa. En p00-lab trabajarás como alumno, así que verás $. Cuando una práctica necesite instalar una herramienta, la orden comenzará por sudo; esto eleva permisos solo para esa orden dentro del contenedor. No uses sudo en el anfitrión ni ejecutes instrucciones que no entiendas.
Entrar y orientarse
Section titled “Entrar y orientarse”Todos los comandos de esta página se ejecutan dentro de p00-lab. Desde la terminal del anfitrión, inicia una sesión:
docker start -ai p00-labsu - alumnodocker start reutiliza la configuración con la que creaste p00-lab, por lo que abre primero Bash como root. su - alumno inicia entonces una sesión del usuario de trabajo creado en P00/01. No intentes cambiarlo añadiendo una opción a docker start: esa orden no permite modificar el usuario del contenedor. -a conecta la salida a tu terminal e -i mantiene abierta la entrada para que puedas escribir.
Punto de partida: ya estás en Bash dentro del contenedor. Averigua dónde estás, qué usuario ejecuta la sesión y qué shell se ha iniciado:
pwdwhoamipspwdmuestra la carpeta de trabajo actual.whoamimuestra la cuenta efectiva.psmuestra los procesos asociados a tu terminal. Debes reconocer al menos Bash.
Si un resultado no coincide con lo esperado, no sigas con comandos que modifiquen archivos. Comprueba primero si has entrado en el contenedor correcto y vuelve a ejecutar pwd.
Leer una salida antes de continuar
Section titled “Leer una salida antes de continuar”No necesitas copiar toda la salida de una orden. Para este primer diagnóstico, anota solo una conclusión por comando:
| Orden | Ejemplo de conclusión útil |
|---|---|
pwd |
«Estoy dentro de /home/alumno; antes de crear evidencias entraré en /optativa-nube». |
whoami |
«La shell usa la cuenta alumno; no estoy administrando el anfitrión». |
ps |
«Bash es un proceso activo de mi terminal». |
Si whoami no muestra alumno o pwd no muestra /home/alumno, no sigas con comandos que modifiquen archivos: vuelve a comprobar que ejecutaste su - alumno. En el siguiente paso entrarás deliberadamente en /optativa-nube.
El lugar de trabajo del curso es /optativa-nube. Repositorios, páginas web, scripts y evidencias se crean ahí porque es la carpeta compartida con el anfitrión. Lo que guardes en otras rutas del contenedor podría perderse al recrearlo.
Crear un sistema de ficheros y directorios
Section titled “Crear un sistema de ficheros y directorios”Construirás el espacio que usarás durante P00. Primero entra en la carpeta compartida y lista su contenido más simple:
cd /optativa-nubepwdlsls muestra los nombres visibles. Cuando necesites más información, usa estas opciones:
| Orden | Qué añade |
|---|---|
ls -l |
Permisos, propietario, tamaño y fecha. |
ls -a |
También muestra nombres que empiezan por .. |
ls -la |
Combina ambas opciones. |
ls -lh |
Muestra los tamaños en un formato más fácil de leer. |
Ahora crea la carpeta principal y entra en ella. Ejecuta una orden, observa el resultado y continúa con la siguiente:
mkdir p00-puesto-nubelscd p00-puesto-nubepwdCrea el primer nivel del sistema de ficheros. Aquí todavía no necesitas -p, porque cada carpeta se crea directamente dentro de la carpeta actual:
mkdir evidenciasmkdir notasmkdir scriptsmkdir weblsDespués crea algunos ficheros vacíos y comprueba el árbol que has construido:
touch README.mdtouch notas/ideas.txttouch web/index.htmllsls -la notastouch crea un fichero vacío si no existe. Si ya existe, no borra su contenido: solo actualiza su fecha de modificación. Aquí lo usas para preparar los archivos que rellenarás después.
Debes tener esta estructura:
/optativa-nube/p00-puesto-nube/├── evidencias/├── notas/│ └── ideas.txt├── scripts/├── web/│ └── index.html└── README.mdRutas absolutas y rutas relativas
Section titled “Rutas absolutas y rutas relativas”Una ruta absoluta empieza por / y no depende de la carpeta actual. Una ruta relativa empieza desde donde estás. Usa el mismo fichero creado antes de las dos maneras:
cat notas/ideas.txtcat /optativa-nube/p00-puesto-nube/notas/ideas.txtLas dos órdenes señalan el mismo fichero. Ahora cambia de carpeta y usa una ruta relativa que incluye .., que significa «la carpeta anterior»:
cd notaspwdcat ideas.txtcat ../README.mdcd ..pwdPara crear varias carpetas anidadas de una vez, sí usarás mkdir -p:
mkdir -p practicas/shell/entradasmkdir -p practicas/shell/salidasls practicas/shellNo uses rutas que no puedas leer y explicar. En este proyecto evita espacios en los nombres: usa minúsculas, guiones y extensiones claras.
Leer, escribir y buscar texto
Section titled “Leer, escribir y buscar texto”echo muestra texto en pantalla. Con > crea o reemplaza un fichero; con >> añade una línea sin borrar las anteriores. Crea un fichero de práctica con un texto breve:
echo "Lorem ipsum dolor sit amet." > notas/lorem.txtecho "Lorem ipsum es un texto de prueba." >> notas/lorem.txtecho "Dolor sit amet, consectetur adipiscing elit." >> notas/lorem.txtecho "La nube permite usar recursos cuando los necesitas." >> notas/lorem.txtcat notas/lorem.txtcat muestra todo el fichero. Para leer solo las primeras líneas, usa head:
head -n 2 notas/lorem.txtgrep busca texto. -n añade el número de línea e -i ignora mayúsculas y minúsculas:
grep -n 'Lorem' notas/lorem.txtgrep -in 'dolor' notas/lorem.txtSi buscas una palabra que no existe, grep no muestra líneas y termina con un código distinto de cero. Compruébalo:
grep -n 'NoExiste' notas/lorem.txtecho "$?"0 significa que la búsqueda encontró texto; otro valor significa que debes interpretar el resultado antes de continuar.
Referencia de los comandos practicados
Section titled “Referencia de los comandos practicados”Antes de los ejercicios, revisa esta tabla. Cada orden se usará sobre el árbol que ya has creado; no necesitas probarla sobre rutas desconocidas.
| Orden | Para qué la usas aquí |
|---|---|
pwd |
Muestra la ruta de la carpeta actual. |
whoami |
Muestra el usuario con el que estás trabajando. |
ls |
Lista nombres visibles; -l añade detalles, -a incluye ocultos y -h simplifica tamaños. |
cd carpeta |
Entra en una carpeta; cd .. vuelve al nivel anterior. |
mkdir carpeta |
Crea una carpeta; mkdir -p ruta/anidada crea también los niveles que falten. |
touch fichero |
Crea un fichero vacío sin escribir contenido. |
cat fichero |
Muestra el contenido completo de un fichero de texto. |
echo "texto" |
Muestra texto; con > lo escribe reemplazando un fichero y con >> lo añade al final. |
cp origen destino |
Copia un fichero conservando el original. |
mv origen destino |
Mueve o renombra un fichero. |
find . -maxdepth 2 -type f |
Busca ficheros desde la carpeta actual, como máximo dos niveles por debajo. |
sort |
Ordena las líneas que recibe; ` |
head -n 2 fichero |
Muestra solo las dos primeras líneas. |
grep -n texto fichero |
Busca texto y muestra sus números de línea; -i ignora mayúsculas y minúsculas. |
wc -l fichero |
Cuenta las líneas de un fichero. |
ps |
Muestra los procesos de tu terminal. |
top |
Muestra procesos que se actualizan en tiempo real; pulsa q para salir. |
chmod u+x fichero |
Da permiso de ejecución al propietario del fichero. |
bash fichero.sh |
Ejecuta un fichero usando Bash. |
./fichero.sh |
Ejecuta un script desde la carpeta actual cuando ya tiene permiso x. |
Veinte ejercicios de comandos Linux
Section titled “Veinte ejercicios de comandos Linux”Punto de partida: estás dentro de /optativa-nube/p00-puesto-nube y has creado el árbol anterior. Realiza los ejercicios en orden. En cada uno, anota el comando y una frase sobre lo que has comprobado.
- Comprueba que estás dentro de la carpeta del proyecto.
- Identifica el usuario con el que estás trabajando.
- Muestra los nombres visibles de la carpeta actual.
- Muestra también los nombres ocultos e identifica al menos uno que empiece por
.. - Muestra el contenido con detalles y tamaños fáciles de leer; indica qué información has añadido respecto al listado simple.
- Crea una carpeta vacía llamada
borrador. - Entra en
borrador, comprueba la ruta y vuelve a la carpeta anterior. - Crea el fichero vacío
borrador/nota.txty comprueba que existe. - Escribe
Práctica de shellen ese fichero y después léelo. - Añade una segunda línea al mismo fichero sin borrar la primera; vuelve a leerlo.
- Copia
borrador/nota.txtcomoevidencias/nota-copiada.txty comprueba que existen ambos ficheros. - Renombra la copia como
evidencias/nota-shell.txt. - Muestra
nota-shell.txtprimero con una ruta relativa y después con la ruta absoluta/optativa-nube/p00-puesto-nube/evidencias/nota-shell.txt. - Crea la ruta
practicas/shell/repasousando una sola orden. - Obtén una lista ordenada de los ficheros creados hasta dos niveles por debajo de la carpeta actual.
- Busca las líneas que contienen
Loremennotas/lorem.txte incluye su número de línea. - Muestra únicamente las dos primeras líneas de
notas/lorem.txt. - Cuenta las líneas de
notas/lorem.txt. - Muestra los permisos de la carpeta
scriptse interpreta los del propietario. - Observa los procesos de tu terminal; después abre el visor de procesos, espera una actualización y ciérralo sin detener ningún proceso.
Cinco ejercicios de mayor dificultad
Section titled “Cinco ejercicios de mayor dificultad”- Crea la ruta
practicas/shell/repaso/resultado.txten un único paso y escribe dentro una línea que identifique la práctica. - Guarda en
evidencias/lineas-lorem.txtsolo las líneas denotas/lorem.txtque contienenLorem, con sus números de línea. - Muestra los ficheros de
notas/ordenados y guarda ese listado enevidencias/listado-notas.txt. - Desde la carpeta
notas/, copialorem.txta../evidencias/lorem-copia.txty verifica que ambas rutas apuntan a ficheros existentes. - Obtén el número de ficheros creados en el proyecto hasta dos niveles de profundidad. Puedes combinar las órdenes que ya conoces.
Cinco ejercicios con un comando nuevo
Section titled “Cinco ejercicios con un comando nuevo”Crea el archivo /optativa-nube/p00-puesto-nube/notas/lorem.txt y realiza los siguientes ejercicios:
El contenido del fichero lorem.txt debe ser el siguiente:
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nunc ullamcorper laoreet neque, sit amet imperdiet turpis congue non. Nullam suscipit nibh vitae auctor feugiat. Duis ac felis lacus. Duis blandit, dolor eu cursus pellentesque, tellus nunc vestibulum velit, vel cursus turpis turpis ac massa. Suspendisse nisl risus, laoreet ut dolor id, pulvinar interdum sem. Ut tempor quam sed nisi condimentum, in malesuada velit dapibus. Duis vel pharetra quam. Duis tincidunt luctus purus eget dignissim. Donec ut ligula metus. In et diam mattis, volutpat nisi in, egestas tortor. Praesent arcu dui, rutrum at tortor quis, auctor molestie ex. Pellentesque cursus purus quis sodales scelerisque. Aliquam consequat egestas posuere.
In condimentum sem sed tellus aliquam, et tincidunt mi tincidunt. Nam at lacinia lacus, sit amet malesuada enim. Pellentesque ut velit eu mauris cursus imperdiet. Aenean quis leo eu massa semper ultrices. Cras ac ligula vitae augue aliquet blandit ac vitae eros. Mauris gravida pulvinar dui, placerat vulputate ipsum consectetur bibendum. Aliquam sollicitudin eros et mauris interdum viverra. Vivamus eget metus quis quam iaculis porta semper ac eros. Proin euismod metus et dui posuere accumsan. Integer varius, elit lacinia auctor vulputate, sapien velit efficitur lectus, id imperdiet nunc enim at velit.
Nullam vitae lectus quis leo accumsan vehicula sit amet in dolor. Mauris tristique libero in nulla venenatis rutrum. Suspendisse ex ex, pellentesque eu tristique sollicitudin, maximus a diam. Nam et sagittis arcu. Cras nec sapien non velit tempus porttitor. Integer sed dolor dui. Aenean vehicula ipsum vitae sapien convallis, et cursus ex mollis. Quisque porttitor nibh eu mi tristique, in bibendum augue rutrum. Donec molestie ornare faucibus. Suspendisse eu tortor tempus, auctor quam at, malesuada metus. Proin rutrum porta nunc a sagittis. Aenean tincidunt commodo neque, sit amet euismod tortor placerat consectetur. Praesent facilisis ut eros nec dignissim. Sed non finibus libero.
Aenean nec semper augue. Nam ligula neque, auctor in leo at, porttitor consequat risus. Donec massa sapien, commodo vitae urna eget, tristique porttitor nibh. Etiam non ipsum aliquam, accumsan tortor ac, semper sem. Morbi cursus mauris augue, non suscipit ipsum bibendum id. Fusce congue vehicula volutpat. Aliquam venenatis eros eget risus vulputate tempus. Sed pulvinar dictum vulputate. Interdum et malesuada fames ac ante ipsum primis in faucibus. Aenean sollicitudin, felis in imperdiet lobortis, diam ipsum molestie ex, a pretium ex nisi vitae quam. Curabitur posuere placerat massa, vel sollicitudin odio egestas sit amet. Nunc vitae scelerisque elit. Mauris nec ante nulla.
Quisque vehicula cursus tortor non pulvinar. Cras tincidunt placerat arcu id tempus. In tempus mi pretium leo convallis, quis imperdiet sapien varius. Pellentesque eget erat eu nibh vestibulum interdum. Proin eu erat nec mauris cursus luctus nec eget quam. Ut eu aliquet ante. Donec leo diam, eleifend id vehicula ullamcorper, placerat vitae dolor. Nam sed elementum eros, in tempus nulla. Ut rhoncus ultricies arcu, non sagittis risus tempus laoreet. Nullam id purus turpis. Integer id rhoncus arcu, at euismod mauris.
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nunc ullamcorper laoreet neque, sit amet imperdiet turpis congue non. Nullam suscipit nibh vitae auctor feugiat. Duis ac felis lacus. Duis blandit, dolor eu cursus pellentesque, tellus nunc vestibulum velit, vel cursus turpis turpis ac massa. Suspendisse nisl risus, laoreet ut dolor id, pulvinar interdum sem. Ut tempor quam sed nisi condimentum, in malesuada velit dapibus. Duis vel pharetra quam. Duis tincidunt luctus purus eget dignissim. Donec ut ligula metus. In et diam mattis, volutpat nisi in, egestas tortor. Praesent arcu dui, rutrum at tortor quis, auctor molestie ex. Pellentesque cursus purus quis sodales scelerisque. Aliquam consequat egestas posuere.
In condimentum sem sed tellus aliquam, et tincidunt mi tincidunt. Nam at lacinia lacus, sit amet malesuada enim. Pellentesque ut velit eu mauris cursus imperdiet. Aenean quis leo eu massa semper ultrices. Cras ac ligula vitae augue aliquet blandit ac vitae eros. Mauris gravida pulvinar dui, placerat vulputate ipsum consectetur bibendum. Aliquam sollicitudin eros et mauris interdum viverra. Vivamus eget metus quis quam iaculis porta semper ac eros. Proin euismod metus et dui posuere accumsan. Integer varius, elit lacinia auctor vulputate, sapien velit efficitur lectus, id imperdiet nunc enim at velit.
Nullam vitae lectus quis leo accumsan vehicula sit amet in dolor. Mauris tristique libero in nulla venenatis rutrum. Suspendisse ex ex, pellentesque eu tristique sollicitudin, maximus a diam. Nam et sagittis arcu. Cras nec sapien non velit tempus porttitor. Integer sed dolor dui. Aenean vehicula ipsum vitae sapien convallis, et cursus ex mollis. Quisque porttitor nibh eu mi tristique, in bibendum augue rutrum. Donec molestie ornare faucibus. Suspendisse eu tortor tempus, auctor quam at, malesuada metus. Proin rutrum porta nunc a sagittis. Aenean tincidunt commodo neque, sit amet euismod tortor placerat consectetur. Praesent facilisis ut eros nec dignissim. Sed non finibus libero.
Aenean nec semper augue. Nam ligula neque, auctor in leo at, porttitor consequat risus. Donec massa sapien, commodo vitae urna eget, tristique porttitor nibh. Etiam non ipsum aliquam, accumsan tortor ac, semper sem. Morbi cursus mauris augue, non suscipit ipsum bibendum id. Fusce congue vehicula volutpat. Aliquam venenatis eros eget risus vulputate tempus. Sed pulvinar dictum vulputate. Interdum et malesuada fames ac ante ipsum primis in faucibus. Aenean sollicitudin, felis in imperdiet lobortis, diam ipsum molestie ex, a pretium ex nisi vitae quam. Curabitur posuere placerat massa, vel sollicitudin odio egestas sit amet. Nunc vitae scelerisque elit. Mauris nec ante nulla.
Quisque vehicula cursus tortor non pulvinar. Cras tincidunt placerat arcu id tempus. In tempus mi pretium leo convallis, quis imperdiet sapien varius. Pellentesque eget erat eu nibh vestibulum interdum. Proin eu erat nec mauris cursus luctus nec eget quam. Ut eu aliquet ante. Donec leo diam, eleifend id vehicula ullamcorper, placerat vitae dolor. Nam sed elementum eros, in tempus nulla. Ut rhoncus ultricies arcu, non sagittis risus tempus laoreet. Nullam id purus turpis. Integer id rhoncus arcu, at euismod mauris.- Muestra únicamente las dos últimas líneas de
notas/lorem.txt.
Pista: tail
- Averigua cuánto espacio ocupa la carpeta actual y muestra el resultado de forma fácil de leer.
Pista: du
- A partir de la ruta absoluta
/optativa-nube/p00-puesto-nube/notas/lorem.txt, muestra solo el nombre final del fichero.
Pista: basename
- Muestra el UID, el GID y los grupos del usuario con el que trabajas.
Pista: id
- Muestra la información completa del sistema Linux que ejecuta el contenedor.
Pista: uname
Cuando los hayas intentado, conserva esta idea de cada orden: tail lee el final de un fichero; du calcula el espacio usado; basename extrae el último nombre de una ruta; id identifica el usuario y sus grupos; uname informa del sistema operativo. Para descubrir las opciones de cada una, consulta su ayuda integrada con NOMBRE_DEL_COMANDO --help.
Cuatro scripts básicos
Section titled “Cuatro scripts básicos”Un script es un fichero de texto que contiene órdenes de Bash. Primero ejecutarás scripts muy cortos con comandos que ya conoces. Todos se crean dentro de scripts/ y se ejecutan desde /optativa-nube/p00-puesto-nube.
1. Mostrar un mensaje
Section titled “1. Mostrar un mensaje”Con tu editor, crea scripts/01-saludo.sh:
#!/usr/bin/env bashecho "Hola desde mi primer script de Bash"La primera línea indica que se usará Bash. La segunda es la misma orden echo que ya has ejecutado en la terminal. Pruébalo con Bash:
bash scripts/01-saludo.shAhora permite ejecutarlo directamente y vuelve a probarlo:
chmod u+x scripts/01-saludo.sh./scripts/01-saludo.sh2. Mostrar el entorno actual
Section titled “2. Mostrar el entorno actual”Crea scripts/02-entorno.sh:
#!/usr/bin/env bashecho "Usuario:"whoamiecho "Carpeta actual:"pwdEjecútalo y comprueba que aparecen alumno y una ruta dentro de /optativa-nube:
bash scripts/02-entorno.sh3. Listar el proyecto
Section titled “3. Listar el proyecto”Crea scripts/03-listar-proyecto.sh:
#!/usr/bin/env bashecho "Contenido del proyecto:"lsecho "Ficheros de notas:"ls notasAntes de ejecutarlo, lee las órdenes y predice qué dos grupos de nombres mostrará. Después compruébalo:
bash scripts/03-listar-proyecto.sh4. Buscar texto en un fichero conocido
Section titled “4. Buscar texto en un fichero conocido”Crea scripts/04-buscar-lorem.sh:
#!/usr/bin/env bashecho "Líneas que contienen Lorem:"grep -n 'Lorem' notas/lorem.txtEjecuta el script y compara su salida con el resultado del ejercicio 16:
bash scripts/04-buscar-lorem.shEstos scripts no reciben argumentos, no modifican ficheros y no usan variables: solo reúnen órdenes conocidas. Antes de pasar al siguiente apartado, comprueba que los cuatro existen:
ls -l scriptsDe órdenes repetidas a un script pequeño
Section titled “De órdenes repetidas a un script pequeño”Un script de Bash es un archivo de texto con una secuencia de órdenes. Sirve para repetir una tarea y dejar claro el procedimiento. No convierte automáticamente una tarea en segura: debes acotar sobre qué archivos actúa y comprobar los resultados.
Crear el script de inventario
Section titled “Crear el script de inventario”Con tu editor, crea scripts/registrar-entorno.sh con el contenido siguiente. El archivo pertenece a /optativa-nube, por lo que estará disponible al reiniciar el contenedor.
#!/usr/bin/env bash# Registra información mínima y no sensible del puesto de P00.set -eu
RUTA_BASE="${1:-/optativa-nube/p00-puesto-nube}"DIRECTORIO_EVIDENCIAS="$RUTA_BASE/evidencias"ARCHIVO="$DIRECTORIO_EVIDENCIAS/entorno-$(date +%F).txt"
if [[ ! -d "$RUTA_BASE" ]]; then echo "No existe la ruta de trabajo: $RUTA_BASE" >&2 exit 1fi
mkdir -p "$DIRECTORIO_EVIDENCIAS"
{ echo "Inventario básico de P00" echo "Fecha: $(date --iso-8601=seconds)" echo "Ruta: $RUTA_BASE" echo "Usuario del contenedor: $(whoami)" echo "Contenido inicial:" ls -la "$RUTA_BASE"} > "$ARCHIVO"
echo "Evidencia creada: $ARCHIVO"Este ejemplo reúne varias ideas importantes:
| Elemento | Función en el script |
|---|---|
#!/usr/bin/env bash |
Indica que el archivo debe interpretarse con Bash. |
# ... |
Es un comentario: explica una decisión y Bash lo ignora. |
set -eu |
Detiene el script ante un error y ante una variable sin definir. No sustituye la revisión humana. |
RUTA_BASE=... |
Guarda una ruta en una variable; no se dejan espacios alrededor de =. |
${1:-valor} |
Usa el primer argumento si existe; si no, usa una ruta segura por defecto. |
$(comando) |
Ejecuta una orden y coloca su resultado dentro de un texto o una variable. |
date +%F |
Produce la fecha en formato AAAA-MM-DD para el nombre del archivo. |
[[ -d ruta ]] |
Comprueba que una ruta existe y es una carpeta. |
if ...; then ... fi |
Toma una decisión según el resultado de una comprobación. |
exit 1 |
Detiene el script e indica que no pudo completar su tarea. |
"$RUTA_BASE" |
Conserva la variable como una sola ruta, incluso si algún día contiene espacios. |
>&2 |
Envía un mensaje de error a la salida de errores. |
{ ... } > archivo |
Agrupa varias salidas y las guarda en una única evidencia. |
bash -n archivo |
Revisa la sintaxis sin ejecutar el script. |
bash -x archivo |
Muestra cada orden justo antes de ejecutarla para facilitar la revisión. |
No incluyas en el script credenciales, contenido de .env, claves SSH ni la salida completa de configuraciones sensibles. Un script puede automatizar un error tan rápido como una tarea útil.
Probar antes de ejecutar
Section titled “Probar antes de ejecutar”Primero revisa la sintaxis sin ejecutar el script:
bash -n scripts/registrar-entorno.shecho "$?"El comando bash -n se utiliza para verificar la sintaxis de un script de Bash sin llegar a ejecutarlo. La opción -n viene de “noexec” (no ejecución). Cuando corres este comando, Bash lee todo el archivo de arriba a abajo y busca errores de estructura o de escritura (como un if sin cerrar con su respectivo fi, comillas mal cerradas o paréntesis faltantes).
Si la sintaxis es correcta, el código de salida será 0 y no aparecerá salida adicional. Ahora ejecútalo explícitamente con Bash y comprueba el archivo creado:
bash scripts/registrar-entorno.shls -l evidencias/entorno-*.txthead -n 20 evidencias/entorno-"$(date +%F)".txtPara ejecutarlo directamente, concede permiso de ejecución solo al propietario y vuelve a comprobar los permisos:
chmod u+x scripts/registrar-entorno.shls -l scripts/registrar-entorno.sh./scripts/registrar-entorno.shLa línea de permisos debe incluir una x en el bloque del propietario. Si el script falla, no lo arregles a ciegas. Ejecuta el modo de trazado para ver cada orden justo antes de que Bash la ejecute:
bash -x scripts/registrar-entorno.shEl modo -x es útil para localizar una ruta o variable inesperada. No copies su salida a un repositorio público sin revisarla: puede revelar nombres de archivos y rutas del entorno.
Variar el script con un argumento controlado
Section titled “Variar el script con un argumento controlado”El script acepta opcionalmente una ruta como primer argumento. Esta ejecución usa la carpeta web y, como no tiene todavía evidencias/, el script la crea dentro de ella:
bash scripts/registrar-entorno.sh /optativa-nube/p00-puesto-nube/webls -la web/evidenciasEsta variante demuestra que $1 puede adaptar un script. Antes de pasar una ruta real, léela y compárala con pwd; no ejecutes scripts de inventario sobre rutas que no comprendas.
Refuerzo: repetición con un bucle pequeño
Section titled “Refuerzo: repetición con un bucle pequeño”Cuando la misma comprobación se aplica a varios archivos conocidos, un bucle evita copiar y pegar. El siguiente ejemplo solo informa de si existen tres rutas del proyecto; no crea, borra ni modifica ninguna:
for ruta in README.md web evidencias; do if [[ -e "$ruta" ]]; then echo "Existe: $ruta" else echo "Falta: $ruta" fidoneEl bucle toma un valor cada vez y lo guarda en ruta. La condición [[ -e ... ]] pregunta si existe. Esta estructura prepara las comprobaciones repetibles que harás más adelante con archivos de proyecto, servicios y evidencias; no se usa para recorrer rutas desconocidas ni para ejecutar borrados masivos.
Cierre de sesión y conexión con lo que sigue
Section titled “Cierre de sesión y conexión con lo que sigue”Antes de salir, deja la evidencia donde corresponde y revisa la estructura:
cd /optativa-nube/p00-puesto-nubefind . -maxdepth 2 -type f | sortexitexitEl primer exit cierra la sesión de alumno y vuelve a la shell inicial de root; el segundo cierra Bash y detiene p00-lab. En la siguiente página convertirás esta misma carpeta en un repositorio Git: los nombres claros, las rutas conocidas y la bitácora que has creado facilitarán revisar qué cambia antes de cada commit.
Fuente para ampliar
Section titled “Fuente para ampliar”- Tutorial de programación de Bash para principiantes de freeCodeCamp: conceptos de shell, scripts, variables, entradas/salidas, condiciones, bucles y depuración.
- Manual de Bash de GNU: referencia de tuberías, redirecciones y características básicas de la shell.