Contenido
En Bash, la forma en la que controlamos la entrada (lo que llega al programa) y la salida (lo que produce el programa) es crucial para automatizar tareas, guardar resultados, procesar archivos y comunicarnos entre procesos.
Este módulo te enseña a usar redirecciones, pipes, flujos estándar y here documents, herramientas que convierten comandos simples en utilidades potentes.
1. Los tres flujos estándar
Todo comando tiene tres “canales”:
| Flujo | Nombre | Descriptor | Significado |
|---|---|---|---|
stdin | entrada estándar | 0 | Lo que el programa lee |
stdout | salida estándar | 1 | Salida normal del programa |
stderr | salida de errores | 2 | Mensajes de error |
Ejemplo mental:
stdin: lo que escribes con el tecladostdout: lo que ves normalmente en pantallastderr: errores que también aparecen en pantalla, pero son distintos
2. Redirección de Salida (> y >>)
Permite enviar la salida a un archivo en lugar de la pantalla.
2.1 Sobrescribir (>)
ls > archivos.txt
Crea archivos.txt con la salida de ls.
Si ya existía, lo sobrescribe.
2.2 Añadir (>>)
date >> registros.txt
Añade la fecha al final sin borrar lo anterior.
3. Redirección de Errores (2>)
Para redirigir errores (stderr):
comando 2> errores.log
Ejemplo típico:
ls /no/existe 2> errores.log
errores.log contendrá:
ls: no se puede acceder a '/no/existe': No existe el archivo o el directorio
4. Redirección combinada (&>, 2>&1)
A veces queremos juntar stdout + stderr.
Hay dos métodos:
4.1 Enviar ambos a un archivo
comando &> salida.log
4.2 Enviar stderr → stdout
comando > salida.log 2>&1
Eso significa:
> salida.log→ stdout va a salida.log2>&1→ stderr va al mismo sitio que stdout
5. Redirección de entrada (<)
Permite que un comando lea datos desde un archivo.
Ejemplo:
sort < notas.txt
Esto ordena las líneas de notas.txt y las muestra por pantalla.
6. Pipes (|)
Los pipes conectan programas entre sí: la salida de uno es la entrada del siguiente.
Formato:
comando1 | comando2
Ejemplo clásico:
ls /etc | grep ssh
Interpretación:
ls /etclista todogrep sshse queda con lo que contenga “ssh”
Más ejemplos útiles:
- Ver procesos y filtrar:
ps aux | grep firefox
- Contar líneas de un archivo:
cat archivo.txt | wc -l
- Buscar puertos en uso:
netstat -tuln | grep ":80"
7. Registro en archivos (logs)
Para guardar salidas a un log sin perder errores:
comando >> log.txt 2>&1
Este patrón se usa muchísimo en servidores.
8. Here Documents (<<)
Permiten “pasar un texto” como entrada a un comando o script.
Ejemplo:
cat << EOF
Hola mundo
Esto es un here document
EOF
Salida:
Hola mundo
Esto es un here document
Usos típicos: scripts SQL, correos, configuraciones, etc.
Ejemplo con mysql:
mysql -u root -p << EOF
SHOW DATABASES;
EOF
9. Here Strings (<<<)
Son como here documents pero para una sola cadena.
Ejemplo:
grep texto <<< "hola texto adiós"
Resultado:
hola texto adiós
10. Ejemplos
Ejemplo 1: Guardar un listado
ls -l > listado.txt
Ejemplo 2: Capturar errores
find / -name "*.conf" 2> errores.txt
Ejemplo 3: Recuento de procesos
ps aux | wc -l
Ejemplo 4: Ordenar archivo y guardar
sort < nombres.txt > nombres_ordenados.txt
Ejemplo 5: Script que registra salida y errores
./backup.sh >> backup.log 2>&1
Ejercicios Propuestos
Ejercicio 1:
Crear un script lista.sh que liste /etc y guarde la salida en etc.txt.
Ejercicio 2:
Crear un script errores.sh que haga ls a un directorio que no existe y guarde el error en errores.log.
Ejercicio 3:
Crear un script red.sh que use un pipe para mostrar solo las líneas de ifconfig que contengan inet.
Ejercicio 4:
Crear un script ordenar.sh que ordene las líneas de ciudades.txt y las guarde en ordenadas.txt.
Soluciones
✅ Ejercicio 1 — lista.sh
Enunciado:
Crear un script lista.sh que liste /etc y guarde la salida en etc.txt.
💡 Solución:
#!/bin/bash
# Script: lista.sh
# Lista el contenido de /etc y lo guarda en etc.txt
ls /etc > etc.txt
echo "Listado guardado en etc.txt"
Tras ejecutarlo:
./lista.sh
etc.txt contendrá el listado del directorio /etc.
✅ Ejercicio 2 — errores.sh
Enunciado:
Crear un script errores.sh que haga ls a un directorio que no existe y guarde el error en errores.log.
💡 Solución:
#!/bin/bash
# Script: errores.sh
# Genera un error de ls y lo guarda en errores.log
ls /ruta/que/no/existe 2> errores.log
echo "Error guardado en errores.log"
Después de ejecutarlo:
cat errores.log
Salida esperada (puede variar según el idioma del sistema):
ls: no se puede acceder a '/ruta/que/no/existe': No existe el archivo o el directorio
✅ Ejercicio 3 — red.sh
Enunciado:
Crear un script red.sh que use un pipe para mostrar solo las líneas de ifconfig que contengan inet.
💡 Solución:
#!/bin/bash
# Script: red.sh
# Muestra solo las líneas con inet usando pipes
ifconfig | grep inet
Si usas ip a (más moderno que ifconfig), sería:
#!/bin/bash
ip a | grep inet
Salida típica:
inet 192.168.1.100/24 brd 192.168.1.255 scope global wlan0
inet6 fe80::abcd:1234:5678:9101/64 scope link
✅ Ejercicio 4 — ordenar.sh
Enunciado:
Crear un script ordenar.sh que ordene las líneas de ciudades.txt y las guarde en ordenadas.txt.
💡 Solución:
#!/bin/bash
# Script: ordenar.sh
# Ordena el archivo ciudades.txt y guarda el resultado
sort < ciudades.txt > ordenadas.txt
echo "Archivo ordenado guardado en ordenadas.txt"
Si ciudades.txt contiene:
Madrid
Sevilla
Barcelona
Valencia
El resultado en ordenadas.txt será:
Barcelona
Madrid
Sevilla
Valencia
Otra opción
Si quieres que los alumnos vean prácticas reales:
Guardar logs sin machacar:
ls /etc >> etc.log 2>&1
Redirigir stdout + stderr a la vez:
comando >> salida.log 2>&1
Ejemplo realista: backup con logging:
./backup.sh >> backup.log 2>&1
Esto se usa en cronjobs y servicios systemd.
Resumen de herramientas usadas en los ejercicios
| Herramienta | Uso |
|---|---|
> | redirigir salida, sobrescribe |
>> | redirigir salida, añade |
2> | redirigir errores |
| ` | ` |
< | redirigir entrada desde archivo |
sort | ordenar líneas |
grep | filtrar texto |






![11. [Reto] Bash Incremental: Aprender Shell a Golpes de Ejemplos 021c8028-9a76-4b0a-90e1-d0617edc9d94](https://laaventuradeaprender.com/wp-content/uploads/2026/01/021c8028-9a76-4b0a-90e1-d0617edc9d94.webp)

