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.
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: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
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 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.
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:
#> 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
#> cat cancion.mp3 > /dev/audio <--- reproduce una canción
#> script.sh > /dev/null <--- Redirecciona la salida del script a ningún lado.
#> 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/
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)
sort < lista_de_servidores.txt uniq < lista_ips.txt
+ sort < lista_desordenada.txt > lista_ordenada.txt <---- sort recibe (stdin) desde un archivo y redirecciona su salida a otro archivo
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.
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.
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.
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"
Y por supuesto también es posible redireccionar stdout y stderr a distintos archivos:
$> comando > salida.txt 2> errores.txt
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
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
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:
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.....