miniatura|Un pipeline de tres programes que s'executen en un terminal de text 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.

Història 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. L'intèrpret d'ordres rc proporciona la funció com a "pipeline branching" a la versió 10 d'Unix, publicada el 1990. L'intèrpret d'ordres Bash va proporcionar la substitució del procés a tot tardar a la versió 1.14, publicada el 1994.

Exemple 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: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 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

Categoria:Sistemes operatius