8. Entrada, Salida y Redirecciones

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

FlujoNombreDescriptorSignificado
stdinentrada estándar0Lo que el programa lee
stdoutsalida estándar1Salida normal del programa
stderrsalida de errores2Mensajes de error

Ejemplo mental:

  • stdin: lo que escribes con el teclado
  • stdout: lo que ves normalmente en pantalla
  • stderr: 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.log
  • 2>&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:

  1. ls /etc lista todo
  2. grep ssh se 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

HerramientaUso
>redirigir salida, sobrescribe
>>redirigir salida, añade
2>redirigir errores
``
<redirigir entrada desde archivo
sortordenar líneas
grepfiltrar texto