En la lección anterior conociste a Veloz Envíos y el toolkit veloz-ops que construiremos durante el curso. Antes de escribir la primera línea de ese toolkit necesitas un entorno de trabajo en condiciones: Bash instalado y en una versión moderna, una terminal cómoda, tus ficheros de configuración bajo control y el esqueleto de directorios del proyecto ya creado. Esta lección es la que más se salta la gente y la que más problemas evita: un entorno mal montado produce errores incomprensibles semanas después ("en mi máquina funciona, en el servidor no"). Vamos a dejarlo bien desde el principio.
Contenido
- Comprobar si ya tienes Bash y en qué versión
- Bash en Linux
- Bash en macOS: el problema de la versión 3.2
- Bash en Windows: WSL2 y Git Bash
- Abrir una terminal y elegir emulador
- Los ficheros de configuración de Bash y cuándo se lee cada uno
- Personalización básica:
PS1, alias yPATH - Crear el esqueleto del proyecto
~/veloz-ops - Recargar la configuración con
source - Elegir editor: nano, vim, VS Code
- Comprobar si ya tienes Bash y en qué versión
Lo primero, siempre, es averiguar de qué partimos. Hay dos formas complementarias de preguntar por la versión de Bash.
GNU bash, versión 5.2.21(1)-release (x86_64-pc-linux-gnu) Copyright (C) 2022 Free Software Foundation, Inc. Licencia GPLv3+: GNU GPL versión 3 o posterior <http://gnu.org/licenses/gpl.html>
Este comando ejecuta el programa bash que se encuentre en tu PATH y le pide que se identifique. Es la versión que se usaría al lanzar un script nuevo.
Aquí no ejecutas ningún programa: consultas una variable interna del shell que tienes abierto ahora mismo. La diferencia importa: si tu terminal arranca Zsh, bash --version te dirá qué Bash hay instalado, pero $BASH_VERSION estará vacío porque no estás dentro de Bash.
1.1 Por qué importa la versión
| Versión | Novedades relevantes | Dónde la encuentras |
|---|---|---|
| 3.2 (2007) | Base POSIX + arrays indexados, [[ ]] |
macOS por defecto |
| 4.0 (2009) | Arrays asociativos (declare -A), ** recursivo, &>> |
Distros antiguas (CentOS 7) |
| 4.2 (2011) | declare -g, índices negativos en arrays |
RHEL 7 |
| 4.4 (2016) | ${var@Q} (citado seguro), mapfile mejorado, local -n |
Debian 9, Ubuntu 18.04 |
| 5.0 (2019) | EPOCHSECONDS, EPOCHREALTIME, BASH_ARGV0 |
Ubuntu 20.04, RHEL 9 |
| 5.1–5.2 (2020-2022) | ${var@k}, mejoras de rendimiento, PROMPT_COMMAND como array |
Ubuntu 22.04/24.04, Fedora |
Para este curso trabajaremos sobre Bash 5.x, que es lo que trae srv-veloz-01 (Ubuntu 24.04 LTS). Los dos puntos donde la versión te morderá de verdad son:
- Arrays asociativos (
declare -A, los "diccionarios" de Bash). Los usaremos en el Módulo 4 para contar envíos por ciudad. No existen antes de Bash 4. ${var@Q}, que devuelve el valor de una variable citado de forma segura para reutilizarlo. Es muy útil en depuración y logging, y requiere Bash 4.4 o superior.
Si tu versión es inferior a 4.4, sigue leyendo: la sección de macOS explica cómo actualizar.
- Bash en Linux
Es el caso más sencillo: prácticamente todas las distribuciones traen Bash instalado y como shell por defecto del usuario. Si por algún motivo faltara:
# Debian, Ubuntu y derivadas
sudo apt update && sudo apt install bash
# Fedora, RHEL, Rocky, AlmaLinux
sudo dnf install bash
# Arch Linux
sudo pacman -S bash
# Alpine Linux (contenedores)
apk add bashDetalle importante para el caso de Alpine: las imágenes Docker basadas en Alpine no traen Bash, solo ash de BusyBox. Si un Dockerfile de Veloz Envíos usa RUN bash script.sh sobre Alpine sin instalarlo, fallará con bash: not found. Es un clásico.
Para saber qué shell tienes asignado como shell de login:
Cuidado con una confusión frecuente: $SHELL no indica el shell que estás ejecutando ahora, sino el que tienes configurado en /etc/passwd como shell de inicio de sesión. Si abres Bash desde dentro de Zsh, $SHELL seguirá diciendo /bin/zsh. La forma fiable de saber dónde estás la veremos en 01-04.
Para cambiar tu shell de login de forma permanente:
El cambio se aplica en la siguiente sesión, no en la actual.
- Bash en macOS: el problema de la versión 3.2
macOS incluye Bash, pero congelado en la versión 3.2 de 2007. El motivo no es técnico sino de licencias: a partir de Bash 4, el proyecto GNU pasó a la licencia GPLv3, que Apple no incorpora en su sistema. Además, desde Catalina el shell por defecto de las cuentas nuevas es Zsh.
Comprueba tu situación:
Si vas a seguir este curso desde macOS, instala un Bash moderno con Homebrew:
# 1. Instalar Homebrew si no lo tienes (consulta brew.sh)
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
# 2. Instalar Bash moderno
brew install bash
# 3. Comprobar dónde ha quedado instalado
brew --prefix bashHomebrew no reemplaza el /bin/bash del sistema (macOS lo protege): instala uno nuevo en /opt/homebrew/bin/bash (Apple Silicon) o /usr/local/bin/bash (Intel). Para que sea el que se use:
# Registrar el nuevo shell como válido
echo "$(brew --prefix)/bin/bash" | sudo tee -a /etc/shells
# Establecerlo como shell de login
chsh -s "$(brew --prefix)/bin/bash"| Ruta | Versión | Qué es |
|---|---|---|
/bin/bash |
3.2 | El de Apple. No se puede tocar. |
/opt/homebrew/bin/bash |
5.x | El moderno, para tu trabajo diario |
/bin/zsh |
5.x | Shell por defecto de macOS desde Catalina |
En tus scripts, usa siempre #!/usr/bin/env bash en lugar de #!/bin/bash: la primera forma busca Bash en el PATH y encontrará el moderno, mientras que la segunda apunta rígidamente al 3.2 de Apple.
- Bash en Windows: WSL2 y Git Bash
Windows no trae Bash, pero hay dos caminos con propósitos muy distintos.
4.1 WSL2 (recomendado)
WSL2 (Windows Subsystem for Linux 2) ejecuta un kernel Linux real dentro de Windows. No es una emulación: es una máquina virtual ligera perfectamente integrada. Es lo más parecido a trabajar en srv-veloz-01 que puedes tener en un portátil Windows.
Desde PowerShell como administrador:
Tras reiniciar y crear tu usuario Linux, ya tienes un Ubuntu completo con Bash 5.2. Comandos útiles desde PowerShell:
wsl --list --verbose # ver distribuciones instaladas y su estado
wsl --set-default Ubuntu-24.04
wsl --shutdown # reiniciar el subsistema si se atascaDentro de WSL, tus discos de Windows aparecen bajo /mnt/c, /mnt/d, etc.
Un consejo de rendimiento que ahorra muchos disgustos: guarda tus proyectos dentro del sistema de ficheros de Linux (/home/tu_usuario/...), no en /mnt/c/.... El acceso entre sistemas de ficheros es lento y los permisos de Linux no se representan correctamente en NTFS.
4.2 Git Bash
Git for Windows incluye Git Bash: un Bash compilado para Windows con un conjunto mínimo de utilidades Unix (ls, grep, sed, ssh). Es cómodo para usar Git y ejecutar scripts sencillos, pero no es Linux: no hay systemd, no hay gestor de paquetes, faltan muchas herramientas y algunos comportamientos difieren.
| Criterio | WSL2 | Git Bash |
|---|---|---|
| Kernel Linux real | Sí | No |
Gestor de paquetes (apt) |
Sí | No |
systemd, cron |
Sí | No |
| Instalación | Requiere activar la característica | Instalador simple |
Fidelidad con srv-veloz-01 |
Alta | Baja |
| Recomendado para este curso | Sí | Solo como apaño |
A partir del Módulo 7 (cron, systemd) Git Bash directamente no servirá. Si trabajas en Windows, instala WSL2.
- Abrir una terminal y elegir emulador
La forma de abrir una terminal depende del sistema:
| Sistema | Cómo abrirla |
|---|---|
| Ubuntu/GNOME | Ctrl + Alt + T, o buscar "Terminal" |
| KDE | Buscar "Konsole" |
| macOS | Cmd + Espacio → "Terminal" o "iTerm" |
| Windows + WSL | Abrir "Windows Terminal" y elegir la pestaña Ubuntu |
Emuladores habituales y por qué elegir uno u otro:
- GNOME Terminal / Konsole: los que trae tu escritorio. Sobradamente suficientes para empezar.
- Windows Terminal: obligatorio en Windows; gestiona pestañas de PowerShell, CMD y WSL en la misma ventana, con buen soporte de colores y fuentes.
- iTerm2 (macOS): división de paneles, búsqueda en el histórico, perfiles. El estándar entre profesionales de Mac.
- Alacritty / WezTerm / Kitty: emuladores acelerados por GPU, muy rápidos con salidas de log enormes.
- La terminal integrada de VS Code: cómoda porque tienes editor y shell en la misma ventana.
Recuerda lo visto en 01-01: el emulador no es el shell. Cambiar de Alacritty a Kitty no cambia una coma de tu Bash.
- Los ficheros de configuración de Bash y cuándo se lee cada uno
Este es el punto donde más confusión existe, y merece que lo entiendas de verdad. Bash lee ficheros distintos según cómo se haya arrancado, y hay dos ejes independientes.
6.1 Los dos ejes: login y interactivo
- Shell de login: es el primero que se arranca cuando te autenticas. Ocurre al entrar por SSH a
srv-veloz-01, al iniciar sesión en una consola de texto, o al ejecutarbash --login. - Shell interactivo: tiene un prompt y espera que teclees. Abrir una pestaña de terminal en el escritorio arranca un shell interactivo que no es de login.
- Shell no interactivo: ejecuta un script y termina. No hay prompt ni persona delante. Es el caso de un script lanzado por cron.
6.2 Tabla de qué se lee y cuándo
| Situación | Ficheros que lee Bash | Ejemplo típico |
|---|---|---|
| Login interactivo | /etc/profile, luego el primero que exista de ~/.bash_profile, ~/.bash_login, ~/.profile |
Entrar por SSH a srv-veloz-01 |
| No-login interactivo | /etc/bash.bashrc y ~/.bashrc |
Abrir una pestaña de terminal |
| No interactivo (script) | Ninguno de los anteriores; solo el fichero indicado en $BASH_ENV, si está definido |
Un script lanzado por cron |
| Cierre de sesión de login | ~/.bash_logout |
Salir de la sesión SSH |
graph TD
A[Arranca Bash] --> B{¿Es shell de login?}
B -->|Sí| C["/etc/profile → ~/.bash_profile<br/>(o ~/.bash_login, o ~/.profile)"]
B -->|No| D{¿Es interactivo?}
D -->|Sí| E["/etc/bash.bashrc → ~/.bashrc"]
D -->|No| F["Nada, salvo $BASH_ENV"]
C --> G[Prompt listo]
E --> G
6.3 La consecuencia práctica
De la tabla se deduce el problema clásico: si pones tus alias en ~/.bash_profile, no aparecerán al abrir una pestaña de terminal (que es no-login), y si los pones solo en ~/.bashrc, no aparecerán al entrar por SSH (que es login). La solución universalmente adoptada es que ~/.bash_profile cargue ~/.bashrc:
# ~/.bash_profile
# Si el shell es interactivo, cargar también la configuración de ~/.bashrc
if [ -f ~/.bashrc ]; then
. ~/.bashrc
fiDesglose línea a línea:
if [ -f ~/.bashrc ]; thencomprueba si existe un fichero regular llamado~/.bashrc. La opción-fsignifica "es un fichero normal". Las condicionales se estudian a fondo en 03-04.- El punto solitario
.es sinónimo desource: ejecuta el contenido de ese fichero en el shell actual, como si lo hubieras tecleado. ficierra elif(esifescrito al revés, una convención de Bash).
En Ubuntu, ~/.profile ya trae esta lógica de fábrica. Si creas un ~/.bash_profile propio, ten en cuenta que ~/.profile dejará de leerse, porque Bash solo lee el primero que encuentre de los tres.
La regla de oro, y lo que debes recordar:
| Qué quieres configurar | Dónde ponerlo |
|---|---|
Alias, funciones, PS1, opciones interactivas |
~/.bashrc |
Variables de entorno (PATH, EDITOR) que deban heredar los programas |
~/.profile o ~/.bash_profile |
| Configuración común a todos los usuarios del servidor | /etc/profile.d/*.sh |
- Personalización básica:
PS1, alias y PATH
PS1, alias y PATH7.1 El prompt PS1
PS1 es la variable que define el aspecto del prompt. Bash admite unas secuencias de escape propias:
| Secuencia | Significado |
|---|---|
\u |
Nombre de usuario |
\h |
Nombre corto de la máquina |
\w |
Directorio actual completo (con ~) |
\W |
Solo el nombre del directorio actual |
\$ |
# si eres root, $ en caso contrario |
\t |
Hora en formato HH:MM:SS |
Un prompt algo más informativo con color, pensado para trabajar en servidores:
Aquí \e[32m activa el verde, \e[34m el azul y \e[0m restablece el color por defecto. Los delimitadores \\[ y \\] son imprescindibles: le indican a Bash que lo que hay dentro no ocupa espacio en pantalla. Si los omites, el shell calculará mal la longitud de la línea y verás el texto pisándose al usar el historial.
Un consejo profesional muy útil: usa colores distintos en tu portátil y en el servidor de producción. Un prompt rojo en srv-veloz-01 es un recordatorio visual constante de dónde estás tecleando, y previene el clásico rm ejecutado en la máquina equivocada.
7.2 Alias
Un alias es un atajo: una palabra que Bash sustituye por otra cosa antes de ejecutar.
Ahora, escribir ll equivale a escribir ls -lh. Aspectos que debes conocer:
- No dejes espacios alrededor del
=:alias ll = 'ls -lh'da error. - Los alias solo funcionan en shells interactivos. Un script no los ve; por eso en scripts se usan funciones (Módulo 4), no alias.
aliassin argumentos lista todos los definidos.- Para saltarte temporalmente un alias, antepone una barra invertida:
\lsejecuta ellsreal.
7.3 La variable PATH
PATH es una lista de directorios, separados por dos puntos, donde Bash busca los programas cuando escribes un nombre de comando.
Cuando escribes date, Bash recorre esos directorios de izquierda a derecha y ejecuta la primera coincidencia. El mecanismo completo de búsqueda lo desmenuzaremos en la lección 01-04.
Para añadir un directorio propio:
Tres detalles que importan:
exporthace que la variable se herede por los programas que lances desde este shell. Sinexportsolo existiría en el shell actual.- Poner
$HOME/veloz-ops/bindelante significa que tus scripts tienen prioridad. Ponerlo detrás ($PATH:$HOME/veloz-ops/bin) es más conservador, porque evita que un script tuyo llamadolssombree al del sistema. - Nunca incluyas
.(el directorio actual) en elPATH. Es un riesgo de seguridad clásico: bastaría con que alguien dejara un fichero llamadolsen un directorio compartido para que lo ejecutaras sin querer. Lo trataremos en 08-03.
- Crear el esqueleto del proyecto
~/veloz-ops
~/veloz-opsLlega el momento de crear la estructura que nos acompañará todo el curso. Cada directorio tiene un propósito claro, imitando la convención de cualquier paquete Unix:
| Directorio | Contenido | Ejemplo futuro |
|---|---|---|
bin/ |
Scripts ejecutables, los que se invocan por su nombre | veloz-informe, veloz-backup |
lib/ |
Funciones reutilizables que otros scripts cargan con source |
log.sh, csv.sh |
etc/ |
Ficheros de configuración | veloz-ops.conf |
logs/ |
Salida generada por nuestros propios scripts | informe-2026-08-03.log |
Créalo con un solo comando:
Analicemos esta línea, porque tiene dos ideas nuevas:
mkdircrea directorios. La opción-psignifica "crea también los directorios padre que hagan falta y no te quejes si ya existen". Sin-p, el comando fallaría si~/veloz-opsno existiera todavía.{bin,lib,etc,logs}es una expansión de llaves: Bash la convierte en cuatro rutas antes de ejecutar nada. Es decir,mkdirrecibe realmente cuatro argumentos. Esta expansión se estudia en 02-05.
Comprueba el resultado:
/home/joan/veloz-ops: bin etc lib logs /home/joan/veloz-ops/bin: /home/joan/veloz-ops/etc: /home/joan/veloz-ops/lib: /home/joan/veloz-ops/logs:
Ahora añade bin/ al PATH de forma permanente. Abre ~/.bashrc con tu editor y añade al final:
# --- Toolkit veloz-ops ---
export PATH="$HOME/veloz-ops/bin:$PATH"
alias ops='cd ~/veloz-ops'
alias veloz-logs='cd /var/log/veloz'Observa que se usa $HOME y no ~. Dentro de comillas dobles, la virgulilla no se expande, así que "~/veloz-ops/bin" crearía una ruta literal inválida. $HOME sí funciona siempre. Es un error muy habitual y difícil de detectar.
- Recargar la configuración con
source
sourceHas editado ~/.bashrc, pero tu shell abierto no se entera solo: leyó ese fichero al arrancar y no vuelve a mirarlo. Tienes dos opciones: cerrar y abrir la terminal, o recargarlo.
O de forma equivalente y más portable:
source ejecuta el contenido del fichero en el shell actual, de modo que las variables y alias que define quedan disponibles aquí y ahora. Esto es distinto de ejecutar el fichero como un script: en ese caso Bash arrancaría un proceso hijo, definiría las variables allí y las perdería al terminar. Esa diferencia —fundamental y responsable de innumerables horas perdidas— la entenderás del todo en la lección 01-04, al hablar de subshells.
Verifica que ha funcionado:
Este comando parte el PATH por los dos puntos y muestra las tres primeras entradas; tr y las tuberías se explican en el Módulo 2, aquí solo lo usamos para leer cómodamente.
Un aviso: si ejecutas source ~/.bashrc varias veces, la línea export PATH="$HOME/veloz-ops/bin:$PATH" añadirá el directorio repetidamente. No es grave, pero ensucia. Una versión defensiva:
# Añadir solo si no está ya presente
case ":$PATH:" in
*":$HOME/veloz-ops/bin:"*) ;;
*) export PATH="$HOME/veloz-ops/bin:$PATH" ;;
esacLa sentencia case se ve en 04-05; guárdala como receta por ahora.
- Elegir editor: nano, vim, VS Code
Vas a escribir muchos ficheros de texto. Elige una herramienta y apréndela mínimamente.
| Editor | Curva de aprendizaje | Cuándo usarlo |
|---|---|---|
| nano | Muy baja | Ediciones rápidas en un servidor; está en todas partes |
| vim | Alta | Cuando trabajas mucho por SSH; potentísimo una vez dominado |
| VS Code | Baja | Desarrollo local, con resaltado, ShellCheck y depuración |
| micro | Baja | Alternativa moderna a nano, con atajos tipo escritorio |
10.1 nano
Los atajos aparecen en la parte inferior; ^ significa Ctrl. Los tres imprescindibles: Ctrl+O guarda, Ctrl+X sale, Ctrl+W busca.
10.2 vim
Vim es modal, y ahí está su dificultad inicial. La supervivencia mínima:
- Arrancas en modo normal (los caracteres son órdenes, no texto).
ientra en modo inserción para escribir.Escvuelve a modo normal.:wguarda,:qsale,:wqguarda y sale,:q!sale descartando cambios.
Aunque no lo adoptes, aprende ese mínimo: en un servidor recién instalado puede ser el único editor disponible.
10.3 VS Code con WSL
Si trabajas en Windows con WSL2, instala la extensión WSL de Microsoft. Entonces, desde tu terminal de Ubuntu:
VS Code se abrirá en Windows pero trabajando dentro del sistema de ficheros de Linux, con su terminal integrada apuntando a Bash. Es la mejor combinación de comodidad y fidelidad al entorno del servidor.
Extensiones recomendadas para este curso:
- ShellCheck: marca errores de shell mientras escribes (lo veremos a fondo en 08-05).
- shell-format: formatea scripts automáticamente.
- Bash Debug: permite ejecutar paso a paso.
Por último, define tu editor preferido para que otras herramientas (como crontab -e, que usaremos en el Módulo 7) lo respeten. En ~/.profile:
Errores Comunes y Consejos
- Poner los alias en
~/.bash_profile. No aparecerán al abrir una pestaña de terminal, porque esa es una sesión no-login. Los alias y elPS1van en~/.bashrc. - Crear un
~/.bash_profiley "perder" la configuración de~/.profile. Bash lee solo el primero de~/.bash_profile,~/.bash_login,~/.profile. Si creas el primero, el tercero deja de leerse. - Escribir
export PATH="~/veloz-ops/bin:$PATH". La virgulilla no se expande dentro de comillas dobles. Usa$HOME. - Olvidar
$PATHal reasignarlo. Escribirexport PATH="$HOME/veloz-ops/bin"deja el sistema sin acceso als,grepni nada. Si te ocurre, la sesión actual queda inservible pero se arregla abriendo una terminal nueva y corrigiendo el fichero; para recuperar la sesión rota puedes usarexport PATH=/usr/bin:/binprovisionalmente. - Espacios en
alias ll = 'ls -lh'. En Bash, las asignaciones no admiten espacios alrededor del=. - Editar
~/.bashrcy esperar que el cambio se aplique solo. Recarga consource ~/.bashrco abre una terminal nueva. - Consejo: antes de tocar
~/.bashrc, haz una copia (cp ~/.bashrc ~/.bashrc.bak). Un error de sintaxis ahí puede dejarte con una terminal que muestra errores en cada arranque. - Consejo: si administras varios servidores, mantén tus dotfiles en un repositorio Git. En 08-04 veremos cómo.
Ejercicios
Ejercicio 1: Diagnóstico de tu entorno
Averigua y anota, en tu propia máquina:
- La versión de Bash instalada y si soporta arrays asociativos (necesitas 4.0 o superior).
- Tu shell de login configurado.
- Cuántos directorios tiene tu
PATH. - Si existen
~/.bashrc,~/.bash_profiley~/.profile.
Ejercicio 2: Montar el entorno de veloz-ops
Deja tu entorno listo para el curso:
- Crea
~/veloz-opscon los subdirectoriosbin,lib,etcylogsen un solo comando. - Añade
~/veloz-ops/binal principio delPATHde forma permanente. - Define un alias
opsque te lleve a~/veloz-ops. - Cambia tu prompt para que muestre usuario, máquina y directorio actual.
- Aplica los cambios sin cerrar la terminal y verifica que todo funciona.
Ejercicio 3: Razonar sobre los ficheros de arranque
Un compañero de Veloz Envíos define export API_TOKEN="abc123" únicamente en su ~/.bashrc. Después programa un script en cron que necesita esa variable, y el script falla diciendo que API_TOKEN está vacía.
- Explica por qué falla.
- Propón dos soluciones distintas.
Soluciones
Solución al Ejercicio 1
bash --version | head -1
echo "$BASH_VERSION"
echo "$SHELL"
echo "$PATH" | tr ':' '\n' | wc -l
ls -la ~/.bashrc ~/.bash_profile ~/.profileGNU bash, versión 5.2.21(1)-release (x86_64-pc-linux-gnu) 5.2.21(1)-release /bin/bash 6 -rw-r--r-- 1 joan joan 3771 ago 3 09:12 /home/joan/.bashrc ls: no se puede acceder a '/home/joan/.bash_profile': No existe el archivo o el directorio -rw-r--r-- 1 joan joan 807 ago 3 09:12 /home/joan/.profile
Interpretación: hay Bash 5.2, muy por encima del 4.0 necesario para arrays asociativos; el shell de login es Bash; el PATH tiene 6 entradas (tr convierte los : en saltos de línea y wc -l cuenta líneas); y existen ~/.bashrc y ~/.profile, pero no ~/.bash_profile, que es la configuración estándar de Ubuntu.
Solución al Ejercicio 2
# 1. Estructura de directorios
mkdir -p ~/veloz-ops/{bin,lib,etc,logs}
# 2, 3 y 4. Configuración persistente
cat >> ~/.bashrc << 'EOF'
# --- Toolkit veloz-ops ---
export PATH="$HOME/veloz-ops/bin:$PATH"
alias ops='cd ~/veloz-ops'
PS1='\u@\h:\w\$ '
EOF
# 5. Aplicar y verificar
source ~/.bashrc
echo "$PATH" | tr ':' '\n' | head -1
alias ops
ls ~/veloz-opsLa construcción cat >> fichero << 'EOF' ... EOF es un here-document: añade al final del fichero todo el texto hasta la marca EOF. Las comillas simples alrededor de 'EOF' son importantes: evitan que $HOME y $PATH se expandan ahora en lugar de quedar escritos literalmente en el .bashrc. Los here-documents se estudian en 05-05; también puedes hacerlo simplemente abriendo el fichero con nano ~/.bashrc y escribiendo las líneas a mano.
Solución al Ejercicio 3
-
Falla porque los scripts de cron se ejecutan en un shell no interactivo y sin login. Como vimos en la tabla, en ese modo Bash no lee
~/.bashrcni~/.bash_profile. De hecho,~/.bashrcen Ubuntu empieza con una comprobación que aborta su ejecución si el shell no es interactivo. Por tantoAPI_TOKENnunca llega a definirse en el entorno de cron. -
Dos soluciones válidas:
- Definir la variable dentro del propio script o en un fichero de configuración que el script cargue explícitamente, por ejemplo
~/veloz-ops/etc/veloz-ops.confcon unsourceal inicio. Es la más limpia y la que usaremos en el curso: el script no depende del entorno de quien lo lance. - Definirla en el propio
crontab, ya que cron admite asignaciones antes de las líneas de tareas (API_TOKEN=abc123). Funciona, pero mezcla secretos con la programación de tareas.
Como variante, podría usarse
BASH_ENVapuntando a un fichero de entorno, pero es poco habitual y frágil. En general, la lección que hay que extraer es: un script no debe depender de la configuración interactiva del usuario. Lo veremos aplicado en 07-01. - Definir la variable dentro del propio script o en un fichero de configuración que el script cargue explícitamente, por ejemplo
Conclusión
Tu entorno ya está listo: sabes qué versión de Bash tienes y por qué importa, cómo conseguir un Bash moderno en Linux, macOS y Windows, y —lo más valioso a medio plazo— qué fichero de configuración se lee en cada situación, que es la raíz de la mayoría de los "a mí no me funciona". Además, ~/veloz-ops ya existe con sus cuatro directorios, su bin está en el PATH y tienes alias y prompt a tu gusto.
Con el terreno preparado, toca aprender a moverte por él. En la siguiente lección, Navegación Básica en la Línea de Comandos, recorrerás el árbol de directorios de Linux, entenderás la anatomía de un comando y explorarás por primera vez la infraestructura real de Veloz Envíos: /var/log/veloz, /srv/veloz/datos y tu propio ~/veloz-ops.
Curso de Programación en Bash
Módulo 1: Introducción a Bash
- ¿Qué es Bash?
- Configurando tu Entorno
- Navegación Básica en la Línea de Comandos
- Entendiendo el Shell
- Encontrar Ayuda: man, help y --help
Módulo 2: Comandos Básicos de Bash
- Operaciones con Archivos y Directorios
- Comandos de Procesamiento de Texto
- Permisos y Propiedad de Archivos
- Redirección y Tuberías
- Comodines y Expansión de Rutas
- Historial y Atajos de Teclado
Módulo 3: Fundamentos de Scripting
- Creando y Ejecutando un Script
- Variables y Constantes
- Operadores Básicos
- Sentencias Condicionales
- Argumentos y Entrada del Usuario
- Comillas, Expansión y Sustitución
Módulo 4: Scripting Intermedio
- Bucles en Bash
- Funciones en Bash
- Arrays y Arrays Asociativos
- Manipulación de Cadenas
- La Sentencia case y los Menús Interactivos
- Aritmética y Cálculos Numéricos
Módulo 5: Técnicas Avanzadas de Scripting
- Operaciones Avanzadas con Archivos
- Gestión de Procesos
- Manejo de Errores y Depuración
- Expresiones Regulares
- Entrada/Salida Avanzada: Descriptores y Here-Documents
- Scripts Modulares y Librerías Reutilizables
Módulo 6: Trabajando con Herramientas Externas
Módulo 7: Automatización y Programación
- Trabajos Cron
- Automatizando Tareas
- Scripts de Respaldo y Restauración
- Monitoreo y Registro
- Servicios y Temporizadores con systemd
- Automatización Remota con SSH
Módulo 8: Mejores Prácticas y Optimización
- Escribiendo Código Legible
- Optimizando Scripts en Bash
- Consideraciones de Seguridad
- Control de Versiones con Git
- Análisis Estático con ShellCheck y shfmt
- Pruebas Automatizadas con Bats
- Portabilidad: POSIX sh frente a Bashismos
