Substitució de processos
En informàtica, la substitució de processos és una forma de comunicació entre processos que permet que l'entrada o sortida d'una ordre aparegui com a fitxer. L'ordre es substitueix en línia, on normalment apareix un nom de fitxer, per l'intèrpret d'ordres. Això permet que els programes que normalment només accepten fitxers puguin llegir directament o escriure en un altre programa.[1]
Història
[modifica]La substitució del procés estava disponible com a opció en temps de compilació per a ksh88
, la versió de 1988 del KornShell de Bell Labs.[2] L'intèrpret d'ordres rc proporciona la funció com a "pipeline branching" a la versió 10 d'Unix, publicada el 1990.[3] L'intèrpret d'ordres Bash va proporcionar la substitució del procés a tot tardar a la versió 1.14, publicada el 1994.[4]
Exemple
[modifica]Els exemples següents utilitzen la sintaxi de KornShell.
L'ordre Unix diff normalment accepta els noms de dos fitxers per comparar, o un nom de fitxer i una entrada estàndard. La substitució de processos permet comparar directament la sortida de dos programes:
$ diff <(sort file1) <(sort file2)
L'expressió <(command)
diu a l'intèrpret d'ordres que executi l'ordre i que la seva sortida aparegui com a fitxer. L' ordre pot ser qualsevol ordre arbitràriament complexa de l'intèrpret d'ordres.
Sense substitució de processos, les alternatives són:
- Desar la sortida de les ordres en un fitxer temporal i, a continuació, llegir els fitxers temporals.
$ sort file2 > /tmp/file2.sorted $ sort file1 | diff - /tmp/file2.sorted $ rm /tmp/file2.sorted
- Crear una canonada amb nom (també coneguda com a FIFO), iniciar una ordre escrivint a la canonada amb nom en segon pla i, a continuació, executar l'altra ordre amb la canonada amb nom com a entrada.
$ mkfifo /tmp/sort2.fifo $ sort file2 > /tmp/sort2.fifo & $ sort file1 | diff - /tmp/sort2.fifo $ rm /tmp/sort2.fifo
Les dues alternatives són més feixugues.
La substitució de processos també es pot utilitzar per capturar la sortida que normalment aniria a un fitxer i redirigir-la a l'entrada d'un procés. La sintaxi de Bash per escriure en un procés és >(command)
. Aquí teniu un exemple amb les ordres tee
, wc
i gzip
que compta les línies d'un fitxer amb wc -l
i el comprimeix amb gzip
d'una sola passada:
$ tee >(wc -l >&2) < bigfile | gzip > bigfile.gz
Mecanisme
[modifica]Sota el capó, la substitució de processos té dues implementacions. En sistemes que admeten /dev/fd
(la majoria de sistemes semblants a Unix), funciona cridant a la crida al sistema pipe()
, que retorna un descriptor de fitxer $fd
per a una nova canonada anònima, i després crea la cadena /dev/fd/$fd
, i el substitueix a la línia d'ordres. En sistemes sense suport /dev/fd
, crida a mkfifo
amb un nou nom de fitxer temporal per crear una canonada amb nom i substitueix aquest nom de fitxer a la línia d'ordres.
Referències
[modifica]- ↑ «Bash Process Substitution: How to Use it» (en anglès), 26-10-2020. [Consulta: 10 desembre 2023].
- ↑ Rosenblatt, Bill. «Appendix A.2». A: Learning the Korn Shell (en anglès). 2a edició. O'Reilly & Associates, April 2002. ISBN 0-596-00195-9.
- ↑ Duff, Tom. Rc — A Shell for Plan 9 and UNIX Systems (en anglès), 1990.
- ↑ «Process Substitution (Bash Reference Manual)» (en anglès). [Consulta: 10 desembre 2023].