Cada proceso tiene al menos tres canales de comunicación disponibles:
- Standard input (STDIN)
- Standard output (STDOUT)
- Standard error (STDERR)
El kernel establece estos canales en nombre del proceso. Como ya comenté en una entrada anterior tenemos varios descriptores que identificar a cada canal de comunicación: - STDIN: 0
- STDOUT: 1
- STDERR: 2
La shell interpreta ‘<’, ‘>’ y ‘>>’ como instrucciones para redirigir la entrada o salida de un comando a o desde un archivo.
- ‘<’ redirecciona STDIN
- ‘>’ redirecciona STDOUT (Reemplazando el contenido existente)
- ‘>>’ redirecciona STDOUT (Añade al final del contenido existente)
$ echo “Mensaje de prueba” > /tmp/mensaje
Este comando almacena el texto en el archivo indicado, creando el archivo si no existiese. Ahora podemos utilizar ese archivo para enviar un correo.
$ mail -s “Probando” usuario < /tmp/mensaje
En el comando anterior, indicamos que la entrada de datos sea el archivo.
Para redireccionar STDOUT y STDERR al mismo sitio, utilizamos ‘&>’. Para redireccionar sólo STDERR, utilizaremos su descriptor, es decir ’2>’
Para probar cómodamente éstas salidas, podemos utilizar el comando find, ya que produce salidas en varios canales. Si ejecutamos:
$ find / -name core
Nos devolverá varios “Permission denied” por falta de permisos. Para descartar estos errores, haríamos lo siguiente:
$ find / -name core 2> /dev/null
Ahora, sólo nos mostrará la STDOUT, es decir, los resultados favorables.
También podemos redireccionar la STDOUT a un archivo para que sea más cómodo revisarlo.
$ find / -name core > /tmp/archivoscore 2> /dev/null
En el ejemplo anterior, redireccionamos STDOUT a un archivo para su posterior revisión, y seguimos descartando los errores enviándolos a /dev/null.
Para conectar la STDOUT de un comando con la STDIN de otro, utilizamos el símbolo ‘|’ conocido como “Pipe”.
$ ps -ef | grep apache
El comando ps nos muestra una lista de todos los procesos activos, y redirecciona su salida al comando grep que lo que hace es seleccionar las líneas que contengan la palabra apache.
Para ejecutar dos comandos ordenadamente en la misma línea, utilizamos el operador ‘&&’. El segundo comando se ejecutará sólo si la STDOUT del primero ha sido satisfactoria.
$ mail -s “Mail importante” jefe < /tmp/contenido && echo “Correo enviado”
Sin embargo, si nos interesa que el segundo comando se ejecute sólo si el primero ha fallado (STDOUT != 0), utilizaremos el operador ‘||’
$ mail -s “Mail importante” jefe < /tmp/contenido || echo “Atención: El correo NO se ha enviado”