Cabe señalar que la sustitución del proceso no se limita al formulario <(command), que utiliza la salida de commandcomo un archivo. También puede tener el formato >(command)que alimenta un archivo como entrada command. Esto también se menciona en la cita del manual bash en la respuesta de @ enzotib.
Para el date | catejemplo anterior, un comando que usa la sustitución de proceso del formulario >(command)para lograr el mismo efecto sería,
date > >(cat)
Tenga en cuenta que lo >anterior >(cat)es necesario. Esto puede ser nuevamente ilustrado claramente echocomo en la respuesta de @ Caleb.
$ echo >(cat)
/dev/fd/63
Entonces, sin el extra >, date >(cat)sería lo mismo date /dev/fd/63que imprimirá un mensaje en stderr.
Supongamos que tiene un programa que solo toma nombres de archivos como parámetros y no procesa stdinni stdout. Usaré el script simplificado psub.shpara ilustrar esto. El contenido de psub.shes
#!/bin/bash
[ -e "$1" -a -e "$2" ] && awk '{print $1}' "$1" > "$2"
Básicamente, prueba que sus dos argumentos son archivos (no necesariamente archivos regulares) y, si este es el caso, escriba el primer campo de cada línea "$1"para "$2"usar awk. Entonces, un comando que combina todo lo mencionado hasta ahora es,
./psub.sh <(printf "a a\nc c\nb b") >(sort)
Esto imprimirá
a
b
c
y es equivalente a
printf "a a\nc c\nb b" | awk '{print $1}' | sort
pero lo siguiente no funcionará, y tenemos que usar la sustitución del proceso aquí,
printf "a a\nc c\nb b" | ./psub.sh | sort
o su forma equivalente
printf "a a\nc c\nb b" | ./psub.sh /dev/stdin /dev/stdout | sort
Si ./psub.shtambién se lee stdinademás de lo mencionado anteriormente, entonces no existe una forma equivalente, y en ese caso no hay nada que podamos usar en lugar de la sustitución del proceso (por supuesto, también puede usar una tubería con nombre o un archivo temporal, pero ese es otro historia).