Redirecciones y pipes
- Flujos estándar
En Linux, cada comando trabaja con tres flujos estándar:
stdin (0): entrada estándar (información que recibe el comando)
stdout (1): salida estándar (información normal que produce)
stderr (2): salida de errores (mensajes de error)
- Redirecciones de salida
Permiten enviar la salida a un archivo o combinar salidas.
comando > salida.txt # stdout a un archivo (sobrescribe)
comando >> salida.txt # stdout a un archivo (agrega al final)
comando 2> errores.txt # stderr a un archivo
comando &> todo.txt # stdout y stderr al mismo archivo
comando > salida.txt 2>&1 # forma POSIX para combinar stdout y stderrEjemplo práctico de 2>&1
Creamos un archivo de prueba:
echo "archivo de prueba" > archivo1.txtSin 2>&1:
ls archivo1.txt archivo_que_no_existe > salida.txt
cat salida.txt
# Muestra:
# archivo1.txtEn la terminal verás:
ls: cannot access 'archivo_que_no_existe': No such file or directoryCon 2>&1:**
ls archivo1.txt archivo_que_no_existe > salida.txt 2>&1
cat salida.txt
# Muestra:
# archivo1.txt
# ls: cannot access 'archivo_que_no_existe': No such file or director3. Redirecciones de entrada
Cuando un comando necesita información, puedes escribirla a mano, pero normalmente se la das desde un archivo o un bloque de texto.
Ejemplo con archivo:
echo -e "Carlos\nAna\nLuis" > nombres.txt
sort < nombres.txt
# Ana
# Carlos
# LuisAquí sort recibe los nombres como si los hubieras escrito línea por línea.
Here-string (<<<)
Sirve para pasar una cadena corta directamente como entrada:
tr '[:lower:]' '[:upper:]' <<< "hola mundo"
# HOLA MUNDOEl comando tr en Linux significa translate (traducir) o transliterate.
Sirve para reemplazar, eliminar o comprimir caracteres en un texto que recibe por entrada estándar (stdin).
Here-document (<<)
Se usa para escribir varias líneas de entrada o incluso crear archivos:
cat <<'EOF' > script.sh
#!/bin/bash
echo "Hola desde here-doc"
EOFTodo lo que escribas entre <<EOF y EOF se manda al comando cat. Aquí se guardó en script.sh.
4. Pipes (|)
Un pipe conecta la salida de un comando con la entrada de otro.
Archivo de ejemplo:
echo -e "uno\ndos\ntres" > archivo.txt
cat archivo.txt | grep "dos"
# dosEn este caso cat manda las líneas a grep, que filtra solo la que contiene “dos”.
Ejemplo bioinformático
Un archivo FASTQ tiene 4 líneas por cada lectura. Con paste - - - - agrupamos esas 4 líneas en una sola y luego contamos:
echo -e "@read1\nACGT\n+\n!!!!\n@read2\nTGCA\n+\n!!!!" | paste - - - - | wc -l
# 2Pipefail
Por defecto, el estado de salida de un pipeline es el del último comando. Si quieres que falle si cualquier parte falla:
set -o pipefail5. tee: ver y guardar a la vez
A veces quieres guardar la salida en un archivo pero también verla en pantalla. Para eso está tee.
echo -e "linea1\nlinea2" | tee lista.txt
# linea1
# linea2
cat lista.txt
# linea1
# linea2Para añadir sin borrar lo previo:
echo "linea3" | tee -a lista.txt6. Sustitución de procesos <( )
Permite pasar la salida de un comando como si fuera un archivo.
Creamos archivos:
echo -e "a\nb\nc" > lista1.txt
echo -e "b\nc\nd" > lista2.txtComparar intersección de dos listas:
comm -12 <(sort lista1.txt) <(sort lista2.txt)
# b
# cAquí sort lista1.txt y sort lista2.txt se ejecutan y sus resultados se tratan como archivos temporales.
7. xargs: construir comandos desde stdin
Algunos programas no aceptan datos por stdin. xargs toma lo que le llega y lo convierte en argumentos de otro comando.
echo -e "archivo1.txt\narchivo2.txt" | xargs -n1 echo Procesando
# Procesando archivo1.txt
# Procesando archivo2.txt-n1: ejecuta el comando con un argumento a la vez.-P4: permite correr varios comandos en paralelo (ej. 4 a la vez).
Ejemplo bioinformático:
find 00_raw -name '*.fastq.gz' | xargs -n1 -P4 gzip -tEsto verifica la integridad de varios archivos FASTQ en paralelo.
8. Buenas prácticas
Usa
set -euo pipefailen scripts para atrapar errores.Prueba comandos con datos pequeños (
head,tail) antes de correrlos en datos grandes.Evita espacios en nombres de archivos; si los hay, usa comillas.
Separa stdout y stderr si necesitas depurar o guardar logs.