Skip to content

~/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.

Todos los comandos de esta página se ejecutan dentro de p00-lab. Desde la terminal del anfitrión, inicia una sesión:

Terminal window
docker start -ai p00-lab
su - alumno

docker 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:

Terminal window
pwd
whoami
ps
  • pwd muestra la carpeta de trabajo actual.
  • whoami muestra la cuenta efectiva.
  • ps muestra 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.

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:

Terminal window
cd /optativa-nube
pwd
ls

ls 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:

Terminal window
mkdir p00-puesto-nube
ls
cd p00-puesto-nube
pwd

Crea el primer nivel del sistema de ficheros. Aquí todavía no necesitas -p, porque cada carpeta se crea directamente dentro de la carpeta actual:

Terminal window
mkdir evidencias
mkdir notas
mkdir scripts
mkdir web
ls

Después crea algunos ficheros vacíos y comprueba el árbol que has construido:

Terminal window
touch README.md
touch notas/ideas.txt
touch web/index.html
ls
ls -la notas

touch 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.md

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:

Terminal window
cat notas/ideas.txt
cat /optativa-nube/p00-puesto-nube/notas/ideas.txt

Las dos órdenes señalan el mismo fichero. Ahora cambia de carpeta y usa una ruta relativa que incluye .., que significa «la carpeta anterior»:

Terminal window
cd notas
pwd
cat ideas.txt
cat ../README.md
cd ..
pwd

Para crear varias carpetas anidadas de una vez, sí usarás mkdir -p:

Terminal window
mkdir -p practicas/shell/entradas
mkdir -p practicas/shell/salidas
ls practicas/shell

No uses rutas que no puedas leer y explicar. En este proyecto evita espacios en los nombres: usa minúsculas, guiones y extensiones claras.

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:

Terminal window
echo "Lorem ipsum dolor sit amet." > notas/lorem.txt
echo "Lorem ipsum es un texto de prueba." >> notas/lorem.txt
echo "Dolor sit amet, consectetur adipiscing elit." >> notas/lorem.txt
echo "La nube permite usar recursos cuando los necesitas." >> notas/lorem.txt
cat notas/lorem.txt

cat muestra todo el fichero. Para leer solo las primeras líneas, usa head:

Terminal window
head -n 2 notas/lorem.txt

grep busca texto. -n añade el número de línea e -i ignora mayúsculas y minúsculas:

Terminal window
grep -n 'Lorem' notas/lorem.txt
grep -in 'dolor' notas/lorem.txt

Si buscas una palabra que no existe, grep no muestra líneas y termina con un código distinto de cero. Compruébalo:

Terminal window
grep -n 'NoExiste' notas/lorem.txt
echo "$?"

0 significa que la búsqueda encontró texto; otro valor significa que debes interpretar el resultado antes de continuar.

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.

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.

  1. Comprueba que estás dentro de la carpeta del proyecto.
  2. Identifica el usuario con el que estás trabajando.
  3. Muestra los nombres visibles de la carpeta actual.
  4. Muestra también los nombres ocultos e identifica al menos uno que empiece por ..
  5. Muestra el contenido con detalles y tamaños fáciles de leer; indica qué información has añadido respecto al listado simple.
  6. Crea una carpeta vacía llamada borrador.
  7. Entra en borrador, comprueba la ruta y vuelve a la carpeta anterior.
  8. Crea el fichero vacío borrador/nota.txt y comprueba que existe.
  9. Escribe Práctica de shell en ese fichero y después léelo.
  10. Añade una segunda línea al mismo fichero sin borrar la primera; vuelve a leerlo.
  11. Copia borrador/nota.txt como evidencias/nota-copiada.txt y comprueba que existen ambos ficheros.
  12. Renombra la copia como evidencias/nota-shell.txt.
  13. Muestra nota-shell.txt primero con una ruta relativa y después con la ruta absoluta /optativa-nube/p00-puesto-nube/evidencias/nota-shell.txt.
  14. Crea la ruta practicas/shell/repaso usando una sola orden.
  15. Obtén una lista ordenada de los ficheros creados hasta dos niveles por debajo de la carpeta actual.
  16. Busca las líneas que contienen Lorem en notas/lorem.txt e incluye su número de línea.
  17. Muestra únicamente las dos primeras líneas de notas/lorem.txt.
  18. Cuenta las líneas de notas/lorem.txt.
  19. Muestra los permisos de la carpeta scripts e interpreta los del propietario.
  20. 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.
  1. Crea la ruta practicas/shell/repaso/resultado.txt en un único paso y escribe dentro una línea que identifique la práctica.
  2. Guarda en evidencias/lineas-lorem.txt solo las líneas de notas/lorem.txt que contienen Lorem, con sus números de línea.
  3. Muestra los ficheros de notas/ ordenados y guarda ese listado en evidencias/listado-notas.txt.
  4. Desde la carpeta notas/, copia lorem.txt a ../evidencias/lorem-copia.txt y verifica que ambas rutas apuntan a ficheros existentes.
  5. Obtén el número de ficheros creados en el proyecto hasta dos niveles de profundidad. Puedes combinar las órdenes que ya conoces.

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.
  1. Muestra únicamente las dos últimas líneas de notas/lorem.txt.

Pista: tail

  1. Averigua cuánto espacio ocupa la carpeta actual y muestra el resultado de forma fácil de leer.

Pista: du

  1. A partir de la ruta absoluta /optativa-nube/p00-puesto-nube/notas/lorem.txt, muestra solo el nombre final del fichero.

Pista: basename

  1. Muestra el UID, el GID y los grupos del usuario con el que trabajas.

Pista: id

  1. 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.

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.

Con tu editor, crea scripts/01-saludo.sh:

#!/usr/bin/env bash
echo "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:

Terminal window
bash scripts/01-saludo.sh

Ahora permite ejecutarlo directamente y vuelve a probarlo:

Terminal window
chmod u+x scripts/01-saludo.sh
./scripts/01-saludo.sh

Crea scripts/02-entorno.sh:

#!/usr/bin/env bash
echo "Usuario:"
whoami
echo "Carpeta actual:"
pwd

Ejecútalo y comprueba que aparecen alumno y una ruta dentro de /optativa-nube:

Terminal window
bash scripts/02-entorno.sh

Crea scripts/03-listar-proyecto.sh:

#!/usr/bin/env bash
echo "Contenido del proyecto:"
ls
echo "Ficheros de notas:"
ls notas

Antes de ejecutarlo, lee las órdenes y predice qué dos grupos de nombres mostrará. Después compruébalo:

Terminal window
bash scripts/03-listar-proyecto.sh

Crea scripts/04-buscar-lorem.sh:

#!/usr/bin/env bash
echo "Líneas que contienen Lorem:"
grep -n 'Lorem' notas/lorem.txt

Ejecuta el script y compara su salida con el resultado del ejercicio 16:

Terminal window
bash scripts/04-buscar-lorem.sh

Estos 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:

Terminal window
ls -l scripts

De ó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.

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 1
fi
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.

Primero revisa la sintaxis sin ejecutar el script:

Terminal window
bash -n scripts/registrar-entorno.sh
echo "$?"

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:

Terminal window
bash scripts/registrar-entorno.sh
ls -l evidencias/entorno-*.txt
head -n 20 evidencias/entorno-"$(date +%F)".txt

Para ejecutarlo directamente, concede permiso de ejecución solo al propietario y vuelve a comprobar los permisos:

Terminal window
chmod u+x scripts/registrar-entorno.sh
ls -l scripts/registrar-entorno.sh
./scripts/registrar-entorno.sh

La 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:

Terminal window
bash -x scripts/registrar-entorno.sh

El 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:

Terminal window
bash scripts/registrar-entorno.sh /optativa-nube/p00-puesto-nube/web
ls -la web/evidencias

Esta 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:

Terminal window
for ruta in README.md web evidencias; do
if [[ -e "$ruta" ]]; then
echo "Existe: $ruta"
else
echo "Falta: $ruta"
fi
done

El 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:

Terminal window
cd /optativa-nube/p00-puesto-nube
find . -maxdepth 2 -type f | sort
exit
exit

El 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.