103.4 - Flujos, pipes y redirecciones: Comandos clave

Descriptores de archivo

DescriptorNombreAbreviaturaPor defecto
0Entrada estandarstdinTeclado
1Salida estandarstdoutPantalla
2Error estandarstderrPantalla

Redireccion de salida estandar (stdout)

OperadorDescripcionEjemplo
>Redirige stdout a archivo (sobreescribe)ls > listado.txt
1>Igual que > (forma explicita)ls 1> listado.txt
>>Redirige stdout a archivo (anade al final)echo "linea" >> log.txt
1>>Igual que >> (forma explicita)echo "linea" 1>> log.txt
`>`Fuerza sobreescritura con noclobber activo

Redireccion de entrada estandar (stdin)

OperadorDescripcionEjemplo
<Usa archivo como entrada estandarsort < nombres.txt
0<Igual que < (forma explicita)sort 0< nombres.txt

Redireccion de error estandar (stderr)

OperadorDescripcionEjemplo
2>Redirige stderr a archivo (sobreescribe)cmd 2> errores.txt
2>>Redirige stderr a archivo (anade)cmd 2>> errores.txt
2> /dev/nullDescarta los erroresfind / -name "f" 2> /dev/null

Combinar stdout y stderr

OperadorDescripcionEjemplo
&>Redirige stdout+stderr a archivocmd &> todo.txt
&>>Anade stdout+stderr a archivocmd &>> todo.txt
> f 2>&1Redirige ambos al mismo archivocmd > salida.txt 2>&1
2>&1stderr va a donde apunte stdoutcmd 2>&1 | grep error
1>&2stdout va a donde apunte stderrecho "error" 1>&2

CUIDADO con el orden: cmd > archivo 2>&1 (correcto) vs cmd 2>&1 > archivo (stderr sigue en pantalla)

/dev/null

UsoDescripcionEjemplo
> /dev/nullDescarta stdoutls > /dev/null
2> /dev/nullDescarta stderrcmd 2> /dev/null
&> /dev/nullDescarta stdout y stderrcmd &> /dev/null
> /dev/null 2>&1Descarta todo (forma clasica)cmd > /dev/null 2>&1
cat /dev/null > archivoVacia un archivocat /dev/null > log.txt

Pipes

OperadorDescripcionEjemplo
|Conecta stdout de cmd1 a stdin de cmd2ls | grep ".txt"
|&Conecta stdout+stderr al siguiente cmdcmd |& grep error

Ejemplos de pipes encadenados

PipelineDescripcion
cat /etc/passwd | cut -d ":" -f 1 | sortExtrae y ordena usuarios
ps aux | grep apache | wc -lCuenta procesos de apache
du -sh /var/* | sort -h | tail -5Top 5 mayores en /var
history | awk '{print $2}' | sort | uniq -c | sort -rn | headComandos mas usados
dmesg | tail -20Ultimos 20 mensajes del kernel
ls -l | grep "^d"Solo directorios del listado

tee

ComandoDescripcionEjemplo
cmd | tee archivoMuestra y guarda en archivols | tee listado.txt
cmd | tee -a archivoMuestra y anade a archivodate | tee -a log.txt
cmd | tee f1 f2Escribe en multiples archivosls | tee f1.txt f2.txt
cmd | tee f | cmd2Guarda salida intermedials | tee tmp.txt | wc -l
echo "x" | sudo tee archivoEscribir como rootecho "1" | sudo tee /proc/x

xargs

ComandoDescripcionEjemplo
cmd | xargs cmd2Convierte stdin en argumentosfind . -name "*.tmp" | xargs rm
cmd | xargs -I {} cmd2 {}Placeholder para argumentofind . | xargs -I {} cp {} /bak/
cmd | xargs -n N cmd2N argumentos por invocacionecho "a b c" | xargs -n 1 echo
cmd | xargs -0 cmd2Delimitador null (espacios en nombres)find . -print0 | xargs -0 rm
cmd | xargs -p cmd2Pide confirmacionfind . | xargs -p rm
cmd | xargs -t cmd2Muestra el comandols | xargs -t file
cmd | xargs -d "D" cmd2Define delimitadorecho "a:b:c" | xargs -d ":" echo

Patron comun: find + xargs

PipelineDescripcion
find . -name "*.log" | xargs rmElimina todos los .log
find . -name "*.txt" | xargs grep "patron"Busca patron en .txt
find . -name "*.jpg" -print0 | xargs -0 mv -t /fotos/Mueve jpgs (nombres con espacios)
find . -type f | xargs chmod 644Cambia permisos de archivos
find . -name "*.c" | xargs wc -lCuenta lineas de codigo C

Here documents

SintaxisDescripcionEjemplo
<< DELIM ... DELIMBloque de texto como stdincat << EOF ... EOF
<< 'DELIM' ... DELIMSin expansion de variablescat << 'EOF' ... EOF
<<- DELIM ... DELIMIgnora tabulaciones inicialescat <<- EOF ... EOF

Ejemplos de here documents

# Crear archivo con contenido
cat << EOF > config.txt
servidor=192.168.1.1
puerto=8080
EOF
 
# Enviar comandos a programa interactivo
ftp servidor << EOF
get archivo.txt
bye
EOF

Here strings

SintaxisDescripcionEjemplo
<<< "cadena"Pasa cadena como stdinwc -w <<< "uno dos tres"
<<< $variablePasa variable como stdintr 'a-z' 'A-Z' <<< $nombre

Ejemplos de here strings

bc <<< "5 + 3"              # Calcula: 8
tr 'a-z' 'A-Z' <<< "hola"  # HOLA
grep "error" <<< "$salida"  # Busca en variable
read a b <<< "valor1 valor2"  # Asigna a variables

Named pipes (FIFOs)

ComandoDescripcionEjemplo
mkfifo nombreCrea named pipemkfifo mi_pipe
mkfifo -m permisos nombreCrea con permisosmkfifo -m 644 mi_pipe
echo "datos" > pipeEscribe en la pipe (bloqueante)echo "hola" > mi_pipe
cat < pipeLee de la pipe (bloqueante)cat < mi_pipe
rm pipeElimina la named piperm mi_pipe

Comparacion pipe normal vs named pipe

CaracteristicaPipe normal (|)Named pipe (FIFO)
PersistenciaTemporal (solo durante ejecucion)Persiste en el filesystem
CreacionAutomatica con |Manual con mkfifo
VisibilidadSolo comandos en la misma lineaCualquier proceso
EliminacionAutomaticaManual con rm
Tipo en ls -lN/Ap (prw-r—r—)

Proteccion noclobber

ComandoDescripcion
set -o noclobberActiva proteccion (> no sobreescribe)
set +o noclobberDesactiva proteccion
>| archivoFuerza sobreescritura con noclobber activo