{"id":714,"date":"2023-10-18T12:48:38","date_gmt":"2023-10-18T10:48:38","guid":{"rendered":"http:\/\/eines-informatiques.recursos.uoc.edu\/introduccion-a-los-entornos-de-trabajo-gnu-linux\/?page_id=714"},"modified":"2025-02-10T21:26:23","modified_gmt":"2025-02-10T19:26:23","slug":"1-12-combinacio-dordres","status":"publish","type":"page","link":"http:\/\/eines-informatiques.recursos.uoc.edu\/introduccion-a-los-entornos-de-trabajo-gnu-linux\/1-12-combinacio-dordres\/","title":{"rendered":"1.12. Combinaci\u00f3 d\u2019ordres"},"content":{"rendered":"<p>Fins ara heu vist nombrosos exemples d\u2019ordres executades individualment al terminal. No obstant aix\u00f2, l\u2019int\u00e8rpret d\u2019ordres t\u00e9 un gran potencial que permet implementar protocols de treball m\u00e9s sofisticats de manera relativament senzilla. Un cas paradigm\u00e0tic \u00e9s la canalitzaci\u00f3 dels resultats de les ordres. En general, la majoria de les ordres executades a Gnu\/Linux generen m\u00e9s informaci\u00f3 de la que pot apar\u00e8ixer en pantalla f\u00edsicament. Per tant, \u00e9s preferible emmagatzemar els resultats dins d\u2019un arxiu per a la seva posterior an\u00e0lisi i visualitzaci\u00f3. Tamb\u00e9 \u00e9s possible que ens interessi convertir el flux de dades generat per un proc\u00e9s emissor d\u2019informaci\u00f3 a l\u2019entrada d\u2019un altre, sense necessitat de generar arxius intermedis. L\u2019int\u00e8rpret d\u2019ordres proporciona una s\u00e8rie de funcionalitats per implementar totes aquestes operacions relacionades amb la comunicaci\u00f3 i l\u2019emmagatzematge de resultats. A la taula 10 es mostren les funcionalitats m\u00e9s utilitzades per combinar ordres.<\/p>\n<div class=\"tabletitle\"><p>Taula 10. Combinaci\u00f3 d\u2019ordres.<\/p>\n<\/div>\n<table>\n<tbody>\n<tr class=\"table-header\">\n<td><strong>Ordre<\/strong><\/td>\n<td><strong>Descripci\u00f3<\/strong><\/td>\n<\/tr>\n<tr>\n<td>proc\u00e9s\u00a0 \u00a0 <code>&gt;<\/code>\u00a0 fitxer<\/td>\n<td>Redirecci\u00f3 de sortida<\/td>\n<\/tr>\n<tr>\n<td>proc\u00e9s\u00a0 <code>&gt;&gt;<\/code>\u00a0 fitxer<\/td>\n<td>Redirecci\u00f3 de sortida sense sobresecriure<\/td>\n<\/tr>\n<tr>\n<td>proc\u00e9s\u00a0 <code>2&gt;<\/code> fitxer<\/td>\n<td>Redirecci\u00f3 del canal error<\/td>\n<\/tr>\n<tr>\n<td>proc\u00e9s\u00a0 \u00a0<code>&lt;\u00a0<\/code> fitxer<\/td>\n<td>Redirecci\u00f3 de l&#8217;entrada<\/td>\n<\/tr>\n<tr>\n<td>proc\u00e9s 1 <code>|<\/code>\u00a0 proc\u00e9s 2<\/td>\n<td>Comunicaci\u00f3 de dos processos<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<div class=\"tablefooter\"><p>Font: elaboraci\u00f3 pr\u00f2pia.<\/p>\n<\/div>\n<p>El proc\u00e9s d\u2019emmagatzematge de dades generades per un proc\u00e9s en un arxiu es coneix com <em>a redirecci\u00f3<\/em>. Un proc\u00e9s t\u00e9 perm\u00eds d\u2019escriptura en dos canals del terminal: sortida i error. Les dades generades normalment pel proc\u00e9s es transmeten a trav\u00e9s del canal de sortida, mentre que els errors d\u2019execuci\u00f3 es comuniquen mitjan\u00e7ant el canal d\u2019error. De manera predeterminada, ambd\u00f3s canals es redirigeixen a la pantalla (terminal). Si l\u2019usuari vol redirigir una d\u2019aquestes dues sortides, ho ha d\u2019indicar expl\u00edcitament al final de l\u2019ordre. El s\u00edmbol <code>&gt;<\/code> indica la redirecci\u00f3 del canal de sortida, mentre que per redirigir el canal d\u2019error s\u2019ha de fer servir la construcci\u00f3 <code>2&gt;<\/code>. En ambd\u00f3s casos, les dades s\u2019emmagatzemen en un arxiu que es pot consultar en qualsevol moment sense necessitat de tornar a executar l\u2019ordre.<\/p>\n<p>Cada ordre t\u00e9 associada una entrada est\u00e0ndard <em>stdin<\/em> (0) (per defecte, el teclat), una sortida est\u00e0ndard <em>stdout<\/em> (1) (per defecte, la consola) i una sortida d\u2019errors est\u00e0ndard <em>stderr<\/em> (2) (per defecte, tamb\u00e9 la consola). Per exemple, l\u2019ordre <code>cat<\/code>, si no rep arguments, llegeix del teclat per l\u2019entrada est\u00e0ndard i el passa a la sortida est\u00e0ndard.<\/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 seq\u00fc\u00e8ncia per estudiar\r\n\r\nSegona seq\u00fc\u00e8ncia per estudiar\r\n\r\n^D<\/pre>\n<p>El final de l\u2019<em>stream<\/em> l\u2019hem assignat des del teclat amb la combinaci\u00f3 de tecles Ctrl+D.<\/p>\n<p>Es pot canviar l\u2019entrada est\u00e0ndard de cat perqu\u00e8 llegeixi d\u2019un fitxer. Tamb\u00e9 serviria per a la majoria de les ordres: <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>L\u2019operador de redirecci\u00f3 de sortida &gt; permet canviar la sortida est\u00e0ndard d\u2019una ordre<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"bash\" data-enlighter-theme=\"mowtwo\">$ cal &gt; calendari<\/pre>\n<p>Aquesta ordre envia el calendari actual al fitxer <em>calendari<\/em>. En aquest cas, el <em>stdout <\/em>de l\u2019ordre <code>cal<\/code> es redirigeix a un fitxer anomenat <em>calendari<\/em> que contindr\u00e0 el que es veuria a la pantalla en executar <code>cal<\/code>.<\/p>\n<p>Per enviar la sortida <em>stderr<\/em> d\u2019un programa a un fitxer, s\u2019executa<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"bash\" data-enlighter-theme=\"mowtwo\">$ grep -ioE 'par(en|ro)?t' dades01 2&gt; error.txt.<\/pre>\n<p>Per enviar la <em>stdout <\/em>a la <em>stderr<\/em>, escrivim en pantalla<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"bash\" data-enlighter-theme=\"mowtwo\">$ grep -ioE 'par(en|ro)?t' dades01 1&gt;&amp;2<\/pre>\n<p>I a la inversa, simplement intercanviant l\u20191 per 2, s\u2019executa<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"bash\" data-enlighter-theme=\"mowtwo\">$ grep -ioE 'par(en|ro)?t' dades01 2&gt;&amp;1.<\/pre>\n<p>Si es vol que l\u2019execuci\u00f3 d\u2019una ordre no generi activitat per pantalla, el que s\u2019anomena<em> execuci\u00f3 silenciosa<\/em>, nom\u00e9s hem de redirigir totes les seves sortides a \/dev\/null. Per exemple, pensant a utilitzar l\u2019ordre <code>find<\/code> (en catal\u00e0, <em>buscar<\/em>), que volem utilitzar perqu\u00e8 esborri tots els arxius acabats 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>Per\u00f2 s\u2019ha d\u2019anar amb compte i estar-ne molt segur, ja que no tindrem cap sortida per pantalla.<\/p>\n<p>Els <em>pipes<\/em> permeten utilitzar de forma simple tant la sortida d\u2019una ordre com l\u2019entrada d\u2019una altra, per exemple,<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"bash\" data-enlighter-theme=\"mowtwo\">$ ls -l | sed -e \"s\/[aeio]\/u\/g\"<\/pre>\n<p>on s\u2019executa l\u2019ordre <code>ls<\/code> i la seva sortida, en comptes d\u2019imprimir-se a la pantalla, s\u2019envia (per un tub o <em>pipe<\/em>) al programa <em>sed<\/em>, que imprimeix la seva sortida corresponent. Un altre exemple: per buscar en el fitxer <em>\/etc\/passwd<\/em> totes les l\u00ednies que acabin amb la paraula <em>false<\/em> podr\u00edem fer<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"bash\" data-enlighter-theme=\"mowtwo\">$ cat \/etc\/passwd | grep false$<\/pre>\n<p>on, primer, s\u2019executa l\u2019ordre <code>cat<\/code>, i la seva sortida es passa per <code>grep<\/code><em>. <\/em>El s\u00edmbol <code>$<\/code> significa \u2018final de la paraula\u2019, per la qual cosa s\u2019estan identificant amb <code>grep<\/code> totes les l\u00ednies que acabis amb <code>false<\/code>.<\/p>\n<p>De vegades, hi ha certs canvis en la sintaxi d\u2019algunes ordres quan s\u2019utilitzen els tubs en transmetre informaci\u00f3. At\u00e8s que no existeixen fitxers auxiliars creats al llarg del <em>pipeline<\/em>, s\u2019ha d\u2019introduir el car\u00e0cter \u00ab<code>\u2013<\/code>\u00bb per denotar en aquest cas que la sortida del proc\u00e9s anterior, a trav\u00e9s del tub, esdev\u00e9 el primer argument de la seg\u00fcent execuci\u00f3. Per a especial atenci\u00f3 en la definici\u00f3 del primer arxiu a utilitzar per l\u2019ordre <code>join<\/code>.<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"bash\" data-enlighter-theme=\"mowtwo\">$ cat fitxer1 | sort -k2r | join \u2013 fitxer2<\/pre>\n","protected":false},"excerpt":{"rendered":"<p>Fins ara heu vist nombrosos exemples d\u2019ordres executades individualment al terminal. No obstant aix\u00f2, l\u2019int\u00e8rpret d\u2019ordres t\u00e9 un gran potencial que permet implementar protocols de treball m\u00e9s sofisticats de manera relativament senzilla. Un cas paradigm\u00e0tic \u00e9s la canalitzaci\u00f3 dels resultats de les ordres. En general, la majoria de les ordres executades a Gnu\/Linux generen m\u00e9s [&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\/wp-json\/wp\/v2\/pages\/714"}],"collection":[{"href":"http:\/\/eines-informatiques.recursos.uoc.edu\/introduccion-a-los-entornos-de-trabajo-gnu-linux\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"http:\/\/eines-informatiques.recursos.uoc.edu\/introduccion-a-los-entornos-de-trabajo-gnu-linux\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"http:\/\/eines-informatiques.recursos.uoc.edu\/introduccion-a-los-entornos-de-trabajo-gnu-linux\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"http:\/\/eines-informatiques.recursos.uoc.edu\/introduccion-a-los-entornos-de-trabajo-gnu-linux\/wp-json\/wp\/v2\/comments?post=714"}],"version-history":[{"count":9,"href":"http:\/\/eines-informatiques.recursos.uoc.edu\/introduccion-a-los-entornos-de-trabajo-gnu-linux\/wp-json\/wp\/v2\/pages\/714\/revisions"}],"predecessor-version":[{"id":1253,"href":"http:\/\/eines-informatiques.recursos.uoc.edu\/introduccion-a-los-entornos-de-trabajo-gnu-linux\/wp-json\/wp\/v2\/pages\/714\/revisions\/1253"}],"wp:attachment":[{"href":"http:\/\/eines-informatiques.recursos.uoc.edu\/introduccion-a-los-entornos-de-trabajo-gnu-linux\/wp-json\/wp\/v2\/media?parent=714"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}