{"id":252,"date":"2023-08-31T12:54:16","date_gmt":"2023-08-31T10:54:16","guid":{"rendered":"http:\/\/eines-informatiques.recursos.uoc.edu\/introduccion-a-los-entornos-de-trabajo-gnu-linux\/?page_id=252"},"modified":"2025-03-07T17:44:45","modified_gmt":"2025-03-07T15:44:45","slug":"1-12-combinacion-de-comandos","status":"publish","type":"page","link":"http:\/\/eines-informatiques.recursos.uoc.edu\/introduccion-a-los-entornos-de-trabajo-gnu-linux\/es\/1-12-combinacion-de-comandos\/","title":{"rendered":"1.12. Combinaci\u00f3n de comandos"},"content":{"rendered":"<p>Hasta ahora hab\u00e9is visto numerosos ejemplos de comandos ejecutados individualmente en el terminal. Sin embargo, el int\u00e9rprete de comandos tiene un gran potencial que permite implementar protocolos de trabajo m\u00e1s sofisticados de manera relativamente sencilla. Un caso paradigm\u00e1tico es la canalizaci\u00f3n de los resultados de los comandos. En general, la mayor\u00eda de los comandos ejecutados en Gnu\/Linux generan m\u00e1s informaci\u00f3n de la que puede aparecer en pantalla f\u00edsicamente. Por lo tanto, es preferible almacenar los resultados dentro de un archivo para su posterior an\u00e1lisis y visualizaci\u00f3n. Tambi\u00e9n es posible que nos interese convertir el flujo de datos generado por un proceso emisor de informaci\u00f3n en la entrada de otro, sin necesidad de generar archivos intermedios. El int\u00e9rprete de comandos proporciona una serie de funcionalidades para implementar todas estas operaciones relacionadas con la comunicaci\u00f3n y el almacenamiento de resultados. En la tabla 10 se muestran las funcionalidades m\u00e1s utilizadas para combinar comandos.<\/p>\n<div class=\"tabletitle\"><p>Tabla 10. Combinaci\u00f3n de comandos.<\/p>\n<\/div>\n<table>\n<tbody>\n<tr class=\"table-header\">\n<td><strong>Comando<\/strong><\/td>\n<td><strong>Descripci\u00f3n<\/strong><\/td>\n<\/tr>\n<tr>\n<td>proceso\u00a0\u00a0\u00a0 <code>&gt;<\/code>\u00a0 fichero<\/td>\n<td>Redirecci\u00f3n de salida<\/td>\n<\/tr>\n<tr>\n<td>proceso\u00a0 <code>&gt;&gt;<\/code>\u00a0 fichero<\/td>\n<td>Redirecci\u00f3n de salida sin sobrescribir<\/td>\n<\/tr>\n<tr>\n<td>proceso\u00a0 <code>2&gt;<\/code>\u00a0 fichero<\/td>\n<td>Redirecci\u00f3n del canal error<\/td>\n<\/tr>\n<tr>\n<td>proceso\u00a0\u00a0 <code>&lt;\u00a0<\/code> fichero<\/td>\n<td>Redirecci\u00f3n de la entrada<\/td>\n<\/tr>\n<tr>\n<td>proceso 1 <code>|<\/code>\u00a0 proceso 2<\/td>\n<td>Comunicaci\u00f3n de dos procesos<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<div class=\"tablefooter\"><p>Fuente: elaboraci\u00f3n propia.<\/p>\n<\/div>\n<p>El proceso de almacenamiento de datos generados por un proceso en un archivo se conoce como <em>redirecci\u00f3n<\/em>. Un proceso tiene permiso de escritura en dos canales del terminal: salida y error. Los datos generados normalmente por el proceso se transmiten a trav\u00e9s del canal de salida, mientras que los errores de ejecuci\u00f3n se comunican mediante el canal de error. De manera predeterminada, ambos canales se redirigen a la pantalla (terminal). Si el usuario desea redirigir una de estas dos salidas, debe indicarlo expl\u00edcitamente al final del comando. El s\u00edmbolo <code>&gt;<\/code> indica la redirecci\u00f3n del canal de salida, mientras que para redirigir el canal de error se debe usar la construcci\u00f3n <code>2&gt;<\/code>. En ambos casos, los datos se almacenan en un archivo que se puede consultar en cualquier momento sin necesidad de volver a ejecutar el comando.<\/p>\n<p>Cada comando tiene asociada una entrada est\u00e1ndar <em>stdin<\/em> (0) (por defecto, el teclado), una salida est\u00e1ndar <em>stdout<\/em> (1) (por defecto la consola) y una salida de errores est\u00e1ndar <em>stderr<\/em> (2) (por defecto tambi\u00e9n la consola). Por ejemplo, el comando <code>cat<\/code>, si no recibe argumentos, lee del teclado por la entrada est\u00e1ndar y lo pasa a la salida est\u00e1ndar.<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"bash\" data-enlighter-theme=\"mowtwo\">$ cat<\/pre>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"raw\" data-enlighter-theme=\"droide\">Primera secuencia por estudiar\r\n\r\nSegunda secuencia por estudiar\r\n\r\n^D<\/pre>\n<p>El final del <em>stream<\/em> se lo hemos asignado desde el teclado con la combinaci\u00f3n de teclas Ctrl+D.<\/p>\n<p>Se puede cambiar la entrada est\u00e1ndar de <code>cat<\/code> para que lea de un fichero. Tambi\u00e9n servir\u00eda para la mayor\u00eda de los comandos: <code>cat, grep, cut, sed\u2026<\/code><\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"bash\" data-enlighter-theme=\"mowtwo\">$ cat &lt; fasta.fa<\/pre>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"raw\" data-enlighter-theme=\"droide\">Name of the system\r\n\r\nNucleotides\r\n\r\n\u2026<\/pre>\n<p>El operador de redirecci\u00f3n de salida &gt; permite cambiar la salida est\u00e1ndar de un comando<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"bash\" data-enlighter-theme=\"mowtwo\">$ cal &gt; calendario<\/pre>\n<p>Esta orden env\u00eda el calendario actual al fichero <em>calendario<\/em>. En este caso, el <em>stdout <\/em>del comando <code>cal<\/code> se redirige a un fichero llamado <em>calendario<\/em> que contendr\u00e1 lo que se ver\u00eda en la pantalla al ejecutar <code>cal<\/code>.<\/p>\n<p>Para enviar la salida <em>stderr <\/em>de un programa a un fichero, se ejecuta<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"bash\" data-enlighter-theme=\"mowtwo\">$ grep -ioE 'par(en|ro)?t' datos01 2&gt; error.txt.<\/pre>\n<p>Para enviar la <em>stdout <\/em>a la <em>stderr<\/em>, escribimos en pantalla<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"bash\" data-enlighter-theme=\"mowtwo\">$ grep -ioE 'par(en|ro)?t' datos01 1&gt;&amp;2<\/pre>\n<p>Y a la inversa, simplemente intercambiando el 1 por 2, se ejecuta<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"bash\" data-enlighter-theme=\"mowtwo\">$ grep -ioE 'par(en|ro)?t' datos01 2&gt;&amp;1.<\/pre>\n<p>Si se quiere que la ejecuci\u00f3n de un comando no genere actividad por pantalla, lo que se denomina <em>ejecuci\u00f3n silenciosa<\/em>, solamente debemos redirigir todas sus salidas a \/dev\/null. Por ejemplo, pensando en utilizar el comando <code>find<\/code> (en castellano, <em>buscar<\/em>), que queremos utilizar para que borre todos los archivos terminados en <em>.mov<\/em> del sistema:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"bash\" data-enlighter-theme=\"mowtwo\">$ rm -f $(find \/ -name \"*.mov\") &amp;&gt; \/dev\/null<\/pre>\n<p>Pero se debe ir con cuidado y estar muy seguro, ya que no tendremos ninguna salida por pantalla.<\/p>\n<p>Los <em>pipes<\/em> permiten utilizar en forma simple tanto la salida de una orden como la entrada de otra, por ejemplo,<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"bash\" data-enlighter-theme=\"mowtwo\">$ ls -l | sed -e \"s\/[aeio]\/u\/g\"<\/pre>\n<p>donde se ejecuta el comando <code>ls<\/code> y su salida, en vez de imprimirse en la pantalla, se env\u00eda (por un tubo o <em>pipe<\/em>) al programa <em>sed<\/em>, que imprime su salida correspondiente. Otro ejemplo, para buscar en el fichero <em>\/etc\/passwd<\/em> todas las l\u00edneas que acaben con la palabra <em>false<\/em> podr\u00edamos hacer<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"bash\" data-enlighter-theme=\"mowtwo\">$ cat \/etc\/passwd | grep false$<\/pre>\n<p>donde, primero, se ejecuta el comando <code>cat<\/code>, y su salida se pasa por <code>grep<\/code><em>. <\/em>\u00a0El s\u00edmbolo <code>$<\/code> significa \u2018final de la palabra\u2019, por lo que se est\u00e1 identificando con <code>grep<\/code> todas las l\u00edneas que termines con <code>false<\/code>.<\/p>\n<p>A veces, hay ciertos cambios en la sintaxis de algunos comandos cuando se utilizan las tuber\u00edas al transmitir informaci\u00f3n. Dado que no existen ficheros auxiliares creados a lo largo del <em>pipeline<\/em>, se debe introducir el car\u00e1cter \u00ab<code>\u2013\u00bb<\/code> para denotar en este caso que la salida del proceso anterior, a trav\u00e9s de la tuber\u00eda, se convierte en el primer argumento de la siguiente ejecuci\u00f3n. Para especial atenci\u00f3n en la definici\u00f3n del primer archivo a emplear por el comando <code>join<\/code>.<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"bash\" data-enlighter-theme=\"mowtwo\">$ cat fichero1 | sort -k2r | join \u2013 fichero2<\/pre>\n","protected":false},"excerpt":{"rendered":"<p>Hasta ahora hab\u00e9is visto numerosos ejemplos de comandos ejecutados individualmente en el terminal. Sin embargo, el int\u00e9rprete de comandos tiene un gran potencial que permite implementar protocolos de trabajo m\u00e1s sofisticados de manera relativamente sencilla. Un caso paradigm\u00e1tico es la canalizaci\u00f3n de los resultados de los comandos. En general, la mayor\u00eda de los comandos ejecutados [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":[],"acf":[],"_links":{"self":[{"href":"http:\/\/eines-informatiques.recursos.uoc.edu\/introduccion-a-los-entornos-de-trabajo-gnu-linux\/es\/wp-json\/wp\/v2\/pages\/252"}],"collection":[{"href":"http:\/\/eines-informatiques.recursos.uoc.edu\/introduccion-a-los-entornos-de-trabajo-gnu-linux\/es\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"http:\/\/eines-informatiques.recursos.uoc.edu\/introduccion-a-los-entornos-de-trabajo-gnu-linux\/es\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"http:\/\/eines-informatiques.recursos.uoc.edu\/introduccion-a-los-entornos-de-trabajo-gnu-linux\/es\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"http:\/\/eines-informatiques.recursos.uoc.edu\/introduccion-a-los-entornos-de-trabajo-gnu-linux\/es\/wp-json\/wp\/v2\/comments?post=252"}],"version-history":[{"count":10,"href":"http:\/\/eines-informatiques.recursos.uoc.edu\/introduccion-a-los-entornos-de-trabajo-gnu-linux\/es\/wp-json\/wp\/v2\/pages\/252\/revisions"}],"predecessor-version":[{"id":1309,"href":"http:\/\/eines-informatiques.recursos.uoc.edu\/introduccion-a-los-entornos-de-trabajo-gnu-linux\/es\/wp-json\/wp\/v2\/pages\/252\/revisions\/1309"}],"wp:attachment":[{"href":"http:\/\/eines-informatiques.recursos.uoc.edu\/introduccion-a-los-entornos-de-trabajo-gnu-linux\/es\/wp-json\/wp\/v2\/media?parent=252"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}