1.12. Combinació d’ordres
Fins ara heu vist nombrosos exemples d’ordres executades individualment al terminal. No obstant això, l’intèrpret d’ordres té un gran potencial que permet implementar protocols de treball més sofisticats de manera relativament senzilla. Un cas paradigmàtic és la canalització dels resultats de les ordres. En general, la majoria de les ordres executades a Gnu/Linux generen més informació de la que pot aparèixer en pantalla físicament. Per tant, és preferible emmagatzemar els resultats dins d’un arxiu per a la seva posterior anàlisi i visualització. També és possible que ens interessi convertir el flux de dades generat per un procés emissor d’informació a l’entrada d’un altre, sense necessitat de generar arxius intermedis. L’intèrpret d’ordres proporciona una sèrie de funcionalitats per implementar totes aquestes operacions relacionades amb la comunicació i l’emmagatzematge de resultats. A la taula 10 es mostren les funcionalitats més utilitzades per combinar ordres.
Taula 10. Combinació d’ordres.
Ordre | Descripció |
procés > fitxer |
Redirecció de sortida |
procés >> fitxer |
Redirecció de sortida sense sobresecriure |
procés 2> fitxer |
Redirecció del canal error |
procés < fitxer |
Redirecció de l’entrada |
procés 1 | procés 2 |
Comunicació de dos processos |
El procés d’emmagatzematge de dades generades per un procés en un arxiu es coneix com a redirecció. Un procés té permís d’escriptura en dos canals del terminal: sortida i error. Les dades generades normalment pel procés es transmeten a través del canal de sortida, mentre que els errors d’execució es comuniquen mitjançant el canal d’error. De manera predeterminada, ambdós canals es redirigeixen a la pantalla (terminal). Si l’usuari vol redirigir una d’aquestes dues sortides, ho ha d’indicar explícitament al final de l’ordre. El símbol >
indica la redirecció del canal de sortida, mentre que per redirigir el canal d’error s’ha de fer servir la construcció 2>
. En ambdós casos, les dades s’emmagatzemen en un arxiu que es pot consultar en qualsevol moment sense necessitat de tornar a executar l’ordre.
Cada ordre té associada una entrada estàndard stdin (0) (per defecte, el teclat), una sortida estàndard stdout (1) (per defecte, la consola) i una sortida d’errors estàndard stderr (2) (per defecte, també la consola). Per exemple, l’ordre cat
, si no rep arguments, llegeix del teclat per l’entrada estàndard i el passa a la sortida estàndard.
$ cat
Primera seqüència per estudiar Segona seqüència per estudiar ^D
El final de l’stream l’hem assignat des del teclat amb la combinació de tecles Ctrl+D.
Es pot canviar l’entrada estàndard de cat perquè llegeixi d’un fitxer. També serviria per a la majoria de les ordres: cat, grep, cut, sed…
$ cat < fasta.fa
Name of the system Nucleotides …
L’operador de redirecció de sortida > permet canviar la sortida estàndard d’una ordre
$ cal > calendari
Aquesta ordre envia el calendari actual al fitxer calendari. En aquest cas, el stdout de l’ordre cal
es redirigeix a un fitxer anomenat calendari que contindrà el que es veuria a la pantalla en executar cal
.
Per enviar la sortida stderr d’un programa a un fitxer, s’executa
$ grep -ioE 'par(en|ro)?t' dades01 2> error.txt.
Per enviar la stdout a la stderr, escrivim en pantalla
$ grep -ioE 'par(en|ro)?t' dades01 1>&2
I a la inversa, simplement intercanviant l’1 per 2, s’executa
$ grep -ioE 'par(en|ro)?t' dades01 2>&1.
Si es vol que l’execució d’una ordre no generi activitat per pantalla, el que s’anomena execució silenciosa, només hem de redirigir totes les seves sortides a /dev/null. Per exemple, pensant a utilitzar l’ordre find
(en català, buscar), que volem utilitzar perquè esborri tots els arxius acabats en .mov del sistema:
$ rm -f $(find / -name "*.mov") &> /dev/null
Però s’ha d’anar amb compte i estar-ne molt segur, ja que no tindrem cap sortida per pantalla.
Els pipes permeten utilitzar de forma simple tant la sortida d’una ordre com l’entrada d’una altra, per exemple,
$ ls -l | sed -e "s/[aeio]/u/g"
on s’executa l’ordre ls
i la seva sortida, en comptes d’imprimir-se a la pantalla, s’envia (per un tub o pipe) al programa sed, que imprimeix la seva sortida corresponent. Un altre exemple: per buscar en el fitxer /etc/passwd totes les línies que acabin amb la paraula false podríem fer
$ cat /etc/passwd | grep false$
on, primer, s’executa l’ordre cat
, i la seva sortida es passa per grep
. El símbol $
significa ‘final de la paraula’, per la qual cosa s’estan identificant amb grep
totes les línies que acabis amb false
.
De vegades, hi ha certs canvis en la sintaxi d’algunes ordres quan s’utilitzen els tubs en transmetre informació. Atès que no existeixen fitxers auxiliars creats al llarg del pipeline, s’ha d’introduir el caràcter «–
» per denotar en aquest cas que la sortida del procés anterior, a través del tub, esdevé el primer argument de la següent execució. Per a especial atenció en la definició del primer arxiu a utilitzar per l’ordre join
.
$ cat fitxer1 | sort -k2r | join – fitxer2