Cabe señalar que la sustitución del proceso no se limita al formulario <(command)
, que utiliza la salida de command
como 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 | cat
ejemplo 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 echo
como en la respuesta de @ Caleb.
$ echo >(cat)
/dev/fd/63
Entonces, sin el extra >
, date >(cat)
sería lo mismo date /dev/fd/63
que imprimirá un mensaje en stderr.
Supongamos que tiene un programa que solo toma nombres de archivos como parámetros y no procesa stdin
ni stdout
. Usaré el script simplificado psub.sh
para ilustrar esto. El contenido de psub.sh
es
#!/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.sh
también se lee stdin
ademá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).