Ús de seqüències de text, canonades i redireccionaments
Introducció
Tots els programes segueixen un principi general: agafen unes dades i en generen un resultat. En una shell, aquesta entrada de dades pot ser un arxiu, un dispositiu,… La sortida d’aquest pot representar-se per pantalla, enviar-se a un sistema d’arxius, reproduir-se per altaveus, etc.
Els processos estàndards en Linux tenen 3 canals de comunicació oberts per defecte:
-
El canal d’entrada estàndard (stdin) - Descriptor 0
-
El canal de sortida estàndard (stdout) - Descriptor 1
-
El canal d’error estàndard (stderr) - Descriptor 2
Aquests canals també són accessibles a través de /dev/stdin, /dev/stdout i /dev/stderr.
Redireccionaments
Per fer una redirecció de la stdout a un arxiu, utilitzarem “>”:
$ cat /proc/cpuinfo > /tmp/cpu.txt
Per defecte, només es redirigeix el contingut del canal stdout. Si volem capturar l’stderr, especificarem seu el descriptor numèric (2):
$ cat /proc/cpuinfo 2> /tmp/error.txt
Si volem capturar tant stdout com stderr, podem utilitzar &> o >&. IMPORTANT no posar espais al voltant de &, sinó Bash executarà el procès en segon pla.
A més, podem enviar el canal de stdout al d’error fent:
$ cat /proc/cpuinfo 1>&2
Però si volguessim enviar l’stderr a la stdin d’un altre programa, no podem. Per això hauriem de regirigir primer stderr a stdout, perquè stdin els pugui llegir.
Si volem enviar la sortida estàndard a un arxiu i només la redireccionem amb un operador “>”, el contingut de l’arxiu es sobreescriurà. Per evitar-ho, podem habilitar la opció noclobber:
$ set -o noclobber
$ cat /proc/cpuinfo > /tmp/error.txt
-bash: /tmp/erorr.txt: cannot overwrite existing file
I per desactivar-la, fem set +o noclobber o set +C.
Si el que volem és agregar contingut a un fitxer, utilitzarem “>>”.
Per reassignar la font de dades de l’stdin, podem utilitzar ‘<’, com en el següent exemple:
$ uniq -c </tmp/error.txt
2 cat: /proc/cpu_info: No such file or directory
On la opció -c mostra els cops que es repeteix una línia. Al redirigir l’arxiu /tmp/erorr.txt sense especificar-li un valor numèric, hem redirigit l’stdin (la comanda seria equivalent a uniq -c 0</tmp/erorr.txt).
Els programes poden utilitzar qualsevol número enter major de 2 com descriptors d’arxiu per entrada i sortida de dades.
Here Document i Here String
Una altra manera de redirigir entrades per a programes són els mètodes Here Document i Here String. La redirecció Here Document es fa quan volem passar múltiples línies com a stdin, i la podem realitzar amb dos símbols “<<”:
$ wc -c <<EOF
> How many characters
> in this Here document?
> EOF
43
Aquest mode acabarà tan bon punt com ingressem una línia amb el contingut del terme final (es pot posar qualsevol cosa, però el més comú és “EOF”).
El mètode Here String és pràcticament igual però només serveix per una línia i s’utilitza amb 3 símbols “<<<”:
$ wc -c <<<"How many characters in this Here string?"
41
I fins aquí el post d’avui. Si t’ha semblat útil pots deixar un comentari i compartir-lo. Ens veiem al següent!