¿Requieres de una instalación o configuración de Linux o sus servicios?
¿Un desarrollo WEB empresarial a la medida?
¿Un curso o capacitación a la medida?
Revisa el sitio de SERVICIOS de LinuxTotal


Redireccionamiento en Linux 

Copyright © 2005-2024 LinuxTotal.com.mx
Se concede permiso para copiar, distribuir y/o modificar este documento siempre y cuando se cite al autor y la fuente de linuxtotal.com.mx y según los términos de la GNU Free Documentation License, Versión 1.2 o cualquiera posterior publicada por la Free Software Foundation.

Autor:  

En linux cualquier comando (o cualquier cosa) que se teclea se le conoce como que está utilizando la entrada estándar [STDIN]. La salida o resultado del comando se le conoce como la salida estándar [STDOUT] y es generalmente la terminal. Asi mismo si hay errores en la ejecución estos se conocen como la salida de error estándar [STDERR] y es también por default la terminal.

Es posible (y muy necesario, sobre todo en shell scripting) redireccionar la entrada y la salida sobre archivos en vez de utilizar la entrada y salida estándar.

Es importante saber que el redireccionamiento también se le conoce o se le llama como Standard I/O o también I/O redirection. (Input/Output)

La siguiente tabla detalla su clasificación y las distintas formas como los podemos identificar:


Dispositivos standard I/O o de redireccionamiento (FILE DESCRIPTORS - FD)

  • File Descriptor 0 STDIN Dispositivo de entrada estandar, por defecto el teclado.
  • File Descriptor 1 STDOUT Dispositivo de salida estandar, por defecto la terminal o pantalla.
  • File Descriptor 2 STDERR Dispositivo de salida de mensajes de error estandar, por defecto la terminal o pantalla.

stdin, stdout, y stderr, como todo en Linux no son más que dispositivos, o realmente archivos (file descriptors en este caso) que se heredan en cada terminal que se abre donde un shell es invocado. Revisa el siguiente listado donde se muestra esto:

#> ls -l /dev/std*
lrwxrwxrwx. 1 root root 15 ago 11 12:30 /dev/stderr -> /proc/self/fd/2
lrwxrwxrwx. 1 root root 15 ago 11 12:30 /dev/stdin -> /proc/self/fd/0
lrwxrwxrwx. 1 root root 15 ago 11 12:30 /dev/stdout -> /proc/self/fd/1

Operadores de redirección (redirection operators)

La siguiente tabla detalla todas las posibles formas de direccionamiento y los símbolos que se utilizan para lograrlo.

Símbolo Descripción
> Redirecciona stdout hacía un archivo. Lo crea si no existe, si existe lo sobreescribe.
ls -l > lista.txt (La salida del comando se envía a un archivo en vez de la terminal.)
>> Redirecciona stdout hacía un archivo. Lo crea si no existe, si existe concatena la salida al final de este.
ps -ef >> procesos.txt (Concatena al archivo procesos.txt la salida del comando.)
< Redirecciona stdin desde un archivo. El contenido de un archivo es la entrada o input del comando.
mail user < texto.txt (El cuerpo del correo a enviar proviene desde un archivo, en vez del teclado).)
2>
2>>
Redirecciona stderr hacía un archivo. Crea (>) o concatena (>>) la salida de errores a un archivo. (ver ejemplos)
1>&2 Redirecciona stdout hacía donde stderr apunte. (ver ejemplos)
2>&1 Redirecciona stderr hacía donde stdout apunte. (ver ejemplos)
OTROS REDIRECCIONAMIENTOS QUE NO UTILIZAN FDs
<< Conocido como HERE-DOCUMENT o HereDoc (ver ejemplos)
<<< Conocido como HERE-STRING (ver ejemplos)
| El símbolo | (pipe) es un tipo de redireccionamiento ya que la salida (stdout) de un comando es la entrada (stdin) de otro.
ls /etc | grep services (La salida del comando a la izqueirda de | se convierte en la entrada del comando a la derecha.)
tee El comando tee redirecciona la salida (stdout) a ambos, un archivo y a la terminal.
ps -ef | tee procesos.txt (La salida de ps se muestra en la terminal y al mismo tiempo se redirecciona al archivo procesos.txt. Con la opción -a (tee -a) concatena al archivo.)

Al redireccionar, los archivos involucrados se abren ANTES.

Al redireccionar todos los archivos involucrados son abiertos/truncados antes de que cualqueir cosa sea escrito a ellos. Esto es más fácil verlo en un ejemplo que explicarlo.

#> date > archivo1      <---- (Creamos 3 archivos)
#> date > archivo2
#> date > archivo3
#>
#> cat archivo1                  <---- todo normal, la salida de date se redireccionó a archivo1, etc.
dom ago 11 15:29:53 CDT 2019
#>
#> ls
archivo1  archivo2  archivo3
#>
#> ls > listado.txt   <---- redireccionamos la salida de ls al archivo  listado.txt
#>
#> ls
archivo1  archivo2  archivo3  listado.txt   <--- tenemos ahora 4 archivos en el directorio

Hasta este punto es bastante explícito lo que se hizo. Entonces, si mostramos el contendio del archivo listado.txt con el comando cat la lógica nos dice que nos mostrará: "archivo1 archivo2 archivo3", ¿correcto?, veamos:

#> cat listado.txt
archivo1
archivo2
archivo3
listado.txt
#>

listado.txt esta contenido en si mismo, antes de que existiera!!!!. Pero esto es porque como dice el título de este apartado, bash, abre (crea) los archivos involucrados ANTES de realizar el redireccionamiento en si. Entonces el comando utilizado ls > listado.txt, hace que listado.txt sea creado y después utilizado, y como el comando solicitado es ls entonces se lista todo lo que hay en el directorio incluyendo el reciente creado listado.txt.


Ejemplos de uso

stdout >, >>, redireccionar salida

Los operadores > (crea archivo, sobreescribe si existe) y >> (crea archivo, concatena si existe) son relativamente fáciles de entender, veamos unos pocos ejemplos más elaborados o con otro tipo de redireccionamiento distintos a un archivo convencional:


CONCATENA AL FINAL DE /etc/fstab
#> echo "/dev/sdb3  /reportes  ext4  defaults 0 0" >> /etc/fstab

#> cat /etc/fstab
tmpfs                   /dev/shm                tmpfs   defaults        0 0
devpts                  /dev/pts                devpts  gid=5,mode=620  0 0
sysfs                   /sys                    sysfs   defaults        0 0
proc                    /proc                   proc    defaults        0 0
/dev/sdb3  /reportes  ext4  defaults 0 0

EN LINUX TODO ES UN ARCHIVO
#> cat cancion.mp3 > /dev/audio     <--- reproduce una canción

ES POSIBLE TAMBIÉN NO MOSTRAR NINGUNA SALIDA
#> script.sh > /dev/null      <--- Redirecciona la salida del script a ningún lado.

UTILIZA SUBSHELLS PARA AGRUPAR LA SALIDA DE VARIOS COMANDOS
#> date ; pwd > test
#> cat test
/root/        <----- solo muestra la salida del último comando 'pwd'

#> (date ; pwd) > test    <---- creando un subshell () se puede agrupar la salida de varios comandos
#> cat test
dom ago 11 18:42:38 CDT 2019
/root/    

> PARA CREAR ARCHIVOS VACIOS

Utilizar el comando touch para crear un archivo vació es una práctica común que también puede realizarse con el operador de redireccionamiento >:

# > documento1
# ll documento1
-rw-r--r--. 1 root root 0 ago 18 21:09 documento1

(Lo anterior es lo mismo a utilizar #> touch documento1)

stdin <, redireccionar entrada

ALIMENTAR UN COMANDO DESDE UN ARCHIVO
sort < lista_de_servidores.txt
uniq < lista_ips.txt

REDIRECCIONADO ENTRADA Y SALIDA EN EL MISMO COMANDO
+
sort < lista_desordenada.txt > lista_ordenada.txt    <---- sort recibe (stdin) desde un archivo
                                                           y redirecciona su salida a otro archivo 

EL FILE DESCRIPTOR 1 ES EL DEFAULT

En los ejemplos anteriores no es necesario especificar el file descriptor (FD) ya que el FD 1 es el default. Los siguientes ejemplos son equivalentes:

$> date > fecha.txt
$> date 1> fecha.txt

Para el caso del stderr, FD 2, si es necesario indicarlo siempre. Como veremos en los siguientes ejemplos.

stderr salida de errores

REDIRECCIONADO LA SALIDA DE ERRORES

Cuando un comando, por cualquier razón, el shell no permite su ejecucción generalmente nos muestra un error. Este mensaje de error su salida estándar es la terminal o stderr:

$> cp archivo1 archivo2
cp: no se puede efectuar `stat' sobre «archivo1»: No existe el fichero o el directorio

(el archivo1 no existe, por lo tanto muestra el respectivo mensaje de error)

$> cp archivo1 archivo2 2> error.txt       <--- redireccionamos stderr hacía un archivo
$> cp archivo1 archivo2 2>> error.txt      <--- si se desea concatenar
$>
$> cat error.txt
cp: no se puede efectuar `stat' sobre «archivo1»: No existe el fichero o el directorio

En el ejemplo anterior utilizamos el file descriptor 2 que corresponde a stderr para poder redireccionar la salida de errores a un archivo.


REDIRECCIONADO LA SALIDA DE ERRORES A NINGÚN LADO

Si no se desea mostrar los errores de salida pero tampoco guardarlos, utilizamos entonces /dev/null:

$> cp archivo1 archivo2  2> /dev/null    <--- stderr es redireccionado al dispositivo null 

/dev/null es un tipo especial de archivo que descarta toda la información que se escribe o se redirige a el. También se le conoce como "null device". También es posible utilizar el dispositivo /dev/zero para lograr el mismo resultado que con /dev/null.


REDIRECCIONADO LA SALIDA DE ERRORES Y LA SALIDA ESTANDAR AL MISMO ARCHIVO

Si se desea utilizar el mismo archivo de salida para la salida normal del comando y para los mensajes de error, entonces utilizamos 2>&1 que indica al shell, manda ambas salidas stdout y stderr a los FD 2 y 1:

$> comando > todo.txt 2>&1

En este ejemplo, estamos indicando, redirecciona stderr hacía donde stdout apunte, y stdout apunta al archivo "todo.txt", por lo tanto este archivo contendrá la salida del comando y los errores si los hubiera.

La otra opción (menos común) es utilizar 1>&2, que indicaría redirecciona la salida del comando stdout hacía donde stderr apunte.

$> comando 2> errores.txt 1>&2    <---- la salida del comando se redirecciona al archivo "errores.txt"

REDIRECCIONADO SALIDA ESTANDAR Y SALIDA DE ERRORES A DISTINTOS ARCHIVOS

Y por supuesto también es posible redireccionar stdout y stderr a distintos archivos:

$> comando > salida.txt 2> errores.txt    

Utilizando << y <<<

<< HERE DOCUMENTO O HereDoc

Es cuando un bloque de texto puede ser redireccionado a un comando o archivo de una manera interactiva. El here document funciona indicando un DELIMITADOR que no es más que una palabra o cadena cualquiera que cierra el bloque de texto que se desea redireccionar. Veámoslo con ejemplos:

$>  wc << fin
> uno dos tres        <--- de manera interactiva el usuario teclea el bloque de texto, el delimitador es la palabra "fin""
> cuatro cinco
> seis
> fin
 3  6 31

El comando wc recibe (stdin) un bloque de texto teclado por el usuario. Indicando el fin del bloque de texto con el delimitador fin. Cuando se recibe este, entonces wc ejecuta su función, al recibir por completo su entrada a examinar, en este caso 3 líneas, 6 palabras, 31 caracteres.

$> cat << TERMINA > documento1
uno dos
tres
cuatro cinco
TERMINA
$>
$> cat documento1
uno dos
tres
cuatro cinco

En este caso el comando cat recibe el redireccionamiento de hereDoc con del delimitador TERMINA, cuando encuentra el delimitador deja de recibir entradas y direcciona lo ingresado al archivo "documento1". Si se quisiera agregar o concatenar a "documento1" se utilizaría cat << TERMINA >> documento1


<<< HERE STRING

La diferencia entre HERE DOCUMENT y HERE STRING es que en HERE STRING no se pasa un delimitador, sino que se pasa una cadena que es interpretada por el comando al que se le redirecciona como un argumento(s). Este argumento puede ser una variable de shell que puede expandirse. Es decir, HERE STRING se compone de una cadena o string de posibles argumentos o variables:

$>  bc <<< 5*5
25

$> sed 's/hola/Hola/' <<< "hola mundo"
Hola mundo


¿Requieres de una instalación o configuración de Linux o sus servicios?
¿Un desarrollo WEB empresarial a la medida?
¿Un curso o capacitación a la medida?
Revisa el sitio de SERVICIOS de LinuxTotal

LinuxTotal en:

Si encuentras útil la información que proveé LinuxTotal, considera realizar un donativo que estimule a seguir proporcionando contenido de calidad y utilidad. Gracias.


Dona a través de paypal::


O a través de bitcoins:


14TNQv5wM3xkSv65gHGQ6s6f8yTZuFTohE
Más artículos de LinuxTotal

En linux cualquier comando (o cualquier cosa) que se teclea se le conoce como que está utilizando la entrada estándar [STDIN]. L....


Linux ofrece multitud de servicios o servidores, estos pueden iniciar o arrancar junto con la carga del sistema o pueden después ....


Muchos validadores de direcciones de correo electrónico devolverán errores cuando se enfrenten con una inusual pero válida dire....


En este tutorial sobre listas de control de acceso en squid, aprenderás lo básico de como configurarlas y establecerlas en la co....


Hay ocasiones en que se te ofrece hacer cálculos matemáticos o aritméticos y no estás en el ambiente gráfico para abrir una c....


Ya son varios los lectores que me preguntan que CMS (content management system) utilizo para este sitio. Ejemplos de CMS son mambo....


Entre los administradores de sistemas Linux es común el término 'one liners', algo asi como 'los de una línea', y se refiere a ....


yum es un paquete administrador de software(software package manager). Es una muy útil herramienta para instalar, actualizar y re....


La más simple definición de un proceso podría ser que es una instancia de un programa en ejecución (corriendo). A los procesos....


Para Linux todo es un archivo, incluyendo dispositivos como discos duros, cdroms, disquetes, unidades de cinta, memorias usb, etc.....



Copyright © LinuxTotal.com.mx 2006-2024
info@linuxtotal.com.mx · linuxtotal.com.mx@gmail.com