<html><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"><title>Redirecciones y tuberías</title><meta name="generator" content="DocBook XSL Stylesheets V1.64.0"><link rel="home" href="index.html" title="Guía de Referencia"><link rel="up" href="cmdline.html" title="Capítulo 3. Introducción a la Línea de comandos"><link rel="previous" href="glob-regex.html" title="Patrones de englobamiento del shell"><link rel="next" href="cmdline-completion.html" title="El completado de la línea de comandos"></head><body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF"><div class="navheader"><table width="100%" summary="Navigation header"><tr><th colspan="3" align="center">Redirecciones y tuberías</th></tr><tr><td width="20%" align="left"><a accesskey="p" href="glob-regex.html">Anterior</a> </td><th width="60%" align="center">Capítulo 3. Introducción a la Línea de comandos</th><td width="20%" align="right"> <a accesskey="n" href="cmdline-completion.html">Siguiente</a></td></tr></table><hr></div><div class="sect1" lang="es"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a name="shell-pipes"></a>Redirecciones y tuberías</h2></div></div><div></div></div><div class="sect2" lang="es"><div class="titlepage"><div><div><h3 class="title"><a name="id2537956"></a>Un poco más sobre los procesos</h3></div></div><div></div></div><p><a name="BId-cmdline-pa82"></a>Para entender el principio de las redirecciones y las tuberías, necesitamos explicar una noción acerca de los procesos que todavía no ha sido introducida. Cada proceso <span class="application">UNIX</span> (esto también incluye a las aplicaciones gráficas, pero excluye a la mayoría de los demonios) abre un mínimo de tres descriptores de archivo: la entrada estándar, la salida estándar, y el error estándar. <a class="indexterm" name="BId-cmdline-it38"></a> <a class="indexterm" name="BId-cmdline-it39"></a> <a class="indexterm" name="BId-cmdline-it40"></a> Sus números respectivos son 0, 1 y 2. En general, estos tres descriptores están asociados con la terminal desde la cual se inició el proceso, siendo el teclado la entrada. El objetivo de las redirecciones y las tuberías es redirigir estos descriptores. Los ejemplos en esta sección lo ayudarán a comprender mejor este concepto.</p></div><div class="sect2" lang="es"><div class="titlepage"><div><div><h3 class="title"><a name="id2538056"></a>Redirecciones</h3></div></div><div></div></div><p><a name="BId-cmdline-pa83"></a>Suponga, por ejemplo, que Usted quiere una lista de los archivos que terminan en <tt class="filename">.png</tt><sup>[<a name="id2538079" href="#ftn.id2538079">8</a>]</sup>en el directorio <tt class="filename">imagenes</tt>. Esta lista es muy larga, por lo que Usted desea almacenarla en un archivo para consultarla a gusto más tarde. Puede ingresar el comando siguiente:</p><a name="BId-cmdline-sc12"></a><table border="0" bgcolor="#E0E0E0"><tr><td><pre class="screen"> $ ls imagenes/*.png 1>lista_de_archivos </pre></td></tr></table><p><a name="BId-cmdline-pa85"></a><a class="indexterm" name="BId-cmdline-it41"></a> Esto significa que la salida estándar de este comando (<tt class="literal">1</tt>) se redirecciona (<tt class="literal">></tt>) al archivo denominado <tt class="filename">lista_de_archivos</tt>. El operador <tt class="literal">></tt> es el operador de redirección de la salida. Si el archivo de redirección no existe, se crea, pero si existe se sobre-escribe su contenido. Sin embargo, el descriptor predeterminado que redirecciona este operador es la salida estándar y no es necesario especificarla en la línea de comandos. Entonces podría haber escrito simplemente:</p><a name="BId-cmdline-sc13"></a><table border="0" bgcolor="#E0E0E0"><tr><td><pre class="screen"> $ ls imagenes/*.png >lista_de_archivos </pre></td></tr></table><p><a name="BId-cmdline-pa86"></a><a class="indexterm" name="BId-cmdline-it42"></a>y el resultado será exactamente el mismo. Luego, puede mirar el archivo usando un visualizador de archivos de texto tal como <span><b class="command">less</b></span>.</p><p><a name="BId-cmdline-pa87"></a><a class="indexterm" name="BId-cmdline-it43"></a>Imagine ahora que Usted quiere saber cuantos de estos archivos hay. En vez de contarlos a mano, puede usar el utilitario denominado <span><b class="command">wc</b></span> (<span class="foreignphrase"><i class="foreignphrase">Word Count</i></span>, Contador de palabras) con la opción <tt class="option">-l</tt>, que escribe en la salida estándar el número de líneas en el archivo. Una solución es la siguiente:</p><a name="BId-cmdline-sc14"></a><table border="0" bgcolor="#E0E0E0"><tr><td><pre class="screen"> wc -l 0<lista_de_archivos </pre></td></tr></table><p><a name="BId-cmdline-pa88"></a>y esto da el resultado deseado. El operador <tt class="literal"><</tt> es el operador de redirección de la entrada, y el descriptor redirigido predeterminadamente es el de la entrada estándar, es decir, <tt class="literal">0</tt>, y Usted simplemente tiene que escribir la línea:</p><a name="BId-cmdline-sc15"></a><table border="0" bgcolor="#E0E0E0"><tr><td><pre class="screen"> wc -l <lista_de_archivos </pre></td></tr></table><p><a name="BId-cmdline-pa89"></a><a class="indexterm" name="BId-cmdline-it44"></a>Suponga ahora que desea quitar todas las “<span class="quote">extensiones</span>” de los archivos y poner el resultado en otro archivo. Una herramienta para hacer esto es <span><b class="command">sed</b></span>, por <span class="foreignphrase"><i class="foreignphrase">Stream EDitor</i></span> (Editor de flujo). Simplemente Usted redirecciona la entrada estándar del comando <span><b class="command">sed</b></span> al archivo <tt class="filename">lista_de_archivos</tt> y redirecciona su salida al archivo resultado, por ejemplo <tt class="filename">la_lista</tt>:</p><a name="BId-cmdline-sc16"></a><table border="0" bgcolor="#E0E0E0"><tr><td><pre class="screen"> sed -e 's/\.png$//g' <lista_de_archivos >la_lista </pre></td></tr></table><p><a name="BId-cmdline-pa90"></a>y aquí tiene creada su lista, disponible para ser consultada a gusto con cualquier visualizador.</p><p><a name="BId-cmdline-pa91"></a>También puede ser útil redirigir el error estándar. Por ejemplo, desea saber a cuales directorios de <tt class="filename">/shared</tt> no tiene acceso: una solución es listar este directorio recursivamente y redirigir los errores a un archivo, a la vez que no se muestra la salida estándar:</p><a name="BId-cmdline-sc17"></a><table border="0" bgcolor="#E0E0E0"><tr><td><pre class="screen"> ls -R /shared >/dev/null 2>errores </pre></td></tr></table><p><a name="BId-cmdline-pa92"></a>lo que significa que se redireccionará la salida estándar (<tt class="literal">></tt>) a <tt class="filename">/dev/null</tt>, un archivo especial donde todo lo que escribe se pierde (es decir que, como efecto secundario, no se muestra la salida estándar) y el canal de error estándar (<tt class="literal">2</tt>) se redirecciona (<tt class="literal">></tt>) al archivo <tt class="filename">errores</tt>.</p></div><div class="sect2" lang="es"><div class="titlepage"><div><div><h3 class="title"><a name="id2538510"></a>Tuberías</h3></div></div><div></div></div><p><a name="BId-cmdline-pa93"></a><a class="indexterm" name="BId-cmdline-it45"></a> Las tuberías (<span class="foreignphrase"><i class="foreignphrase">pipes</i></span>, en inglés) son de alguna forma, una combinación de redirecciones de la entrada y la salida. Su principio es el de un tubo físico, de aquí el nombre: un proceso envía datos por un extremo del tubo y otro proceso lee los datos en el otro extremo. El operador de la tubería es <tt class="literal">|</tt>. Volvamos al ejemplo anterior de la lista de archivos. Suponga que Usted quiere encontrar directamente cuantos archivos hay sin tener que almacenar la lista en un archivo temporal, entonces Usted usaría el comando siguiente:</p><a name="BId-cmdline-sc18"></a><table border="0" bgcolor="#E0E0E0"><tr><td><pre class="screen"> ls imagenes/*.png | wc -l </pre></td></tr></table><p><a name="BId-cmdline-pa94"></a>lo cual significa que la salida estándar del comando <span><b class="command">ls</b></span> (es decir, la lista de archivos) se redirecciona a la entrada estándar del comando <span><b class="command">wc</b></span>. Así, Usted obtiene el resultado deseado.</p><p><a name="BId-cmdline-pa95"></a>Usted también puede construir directamente una lista de archivos “<span class="quote">sin las extensiones</span>” usando el comando siguiente:</p><a name="BId-cmdline-sc19"></a><table border="0" bgcolor="#E0E0E0"><tr><td><pre class="screen"> ls imagenes/*.png | sed -e 's/\.png$//g' >la_lista </pre></td></tr></table><p><a name="BId-cmdline-pa96"></a>o, si desea consultar la lista directamente sin almacenarla en un archivo:</p><a name="BId-cmdline-sc20"></a><table border="0" bgcolor="#E0E0E0"><tr><td><pre class="screen"> ls imagenes/*.png | sed -e 's/\.png$//g' | less </pre></td></tr></table><p><a name="BId-cmdline-pa97"></a><a class="indexterm" name="BId-cmdline-it46"></a>Las tuberías y las redirecciones no están limitadas solamente a textos que pueden ser leídos por seres humanos. Por ejemplo, el comando siguiente enviado desde una <tt class="systemitem">Terminal</tt>:</p><a name="BId-cmdline-sc21"></a><table border="0" bgcolor="#E0E0E0"><tr><td><pre class="screen"> xwd -root | convert - ~/mi_escritorio.png </pre></td></tr></table><p><a name="BId-cmdline-pa98"></a><a class="indexterm" name="BId-cmdline-it47"></a> enviará una captura de pantalla de su escritorio al archivo <tt class="filename">mi_escritorio.png</tt><sup>[<a name="id2538720" href="#ftn.id2538720">9</a>]</sup> en su directorio personal.</p></div><div class="footnotes"><br><hr width="100" align="left"><div class="footnote"><p><sup>[<a name="ftn.id2538079" href="#id2538079">8</a>] </sup>Usted podría creer que decir “<span class="quote">los archivos que terminan en <tt class="filename">.png</tt></span>” en vez de “<span class="quote">las imágenes <span class="acronym">PNG</span></span>” es una locura. Sin embargo, una vez más, los archivos bajo <span class="application">UNIX</span> sólo tienen una extensión por convención: de ninguna manera las extensiones definen un tipo de archivo. Un archivo que termina en <tt class="filename">.png</tt> podría ser perfectamente una imagen <span class="acronym">JPEG</span>, una aplicación, un archivo de texto o cualquier otro tipo de archivo. ¡Lo mismo es cierto también bajo <span class="application">Windows</span>!</p></div><div class="footnote"><p><sup>[<a name="ftn.id2538720" href="#id2538720">9</a>] </sup>Sí, de hecho, será una imagen <span class="acronym">PNG</span> <span><b class="keycap">:-)</b></span> (Siempre y cuando tenga instalado el paquete “<span class="quote"><tt class="filename">ImageMagick</tt></span>” ...)</p></div></div></div><div class="navfooter"><hr><table width="100%" summary="Navigation footer"><tr><td width="40%" align="left"><a accesskey="p" href="glob-regex.html">Anterior</a> </td><td width="20%" align="center"><a accesskey="u" href="cmdline.html">Subir</a></td><td width="40%" align="right"> <a accesskey="n" href="cmdline-completion.html">Siguiente</a></td></tr><tr><td width="40%" align="left" valign="top">Patrones de englobamiento del shell </td><td width="20%" align="center"><a accesskey="h" href="index.html">Inicio</a></td><td width="40%" align="right" valign="top"> El completado de la línea de comandos</td></tr></table></div></body></html>