Process helyettesítés
A named pipe bemutatásakor a következő példát:
tcextract -i mozi.vob -t vob -x mpeg2 > mozi.m2v
tcextract -i mozi.vob -t vob -x ac3 > mozi.ac3
mplex -f 8 -o mozi.mpg mozi.m2v mozi.ac3
átírtam erre az új, hatékonyabb verzióra:
mkfifo aud.fifo
mkfifo vid.fifo
tcextract -i vid.fifo -t vob -x mpeg2 > mozi.m2v &
tcextract -i aud.fifo -t vob -x ac3 > mozi.ac3 &
cat mozi.vob | tee vid1.fifo aud1.fifo > /dev/null
mplex -f 8 -o mozi.mpg mozi.m2v mozi.ac3
rm aud.fifo vid.fifo
Bár ez az új verzió hatékonyabb, hiszen csak egyszer olvassa végig a
mozi.vob
fájlt, semmiképpen sem nevezhető túl szépnek. Kétszer olyan hosszú mint az előző, és a name pipe létrehozás majd törlés elég feleslegesnek tűnik. Szerencsére valóban van egy sokkal tisztább megoldás, a csövek helyett process helyettesítést kell alkalmazni:
cat mozi.vob | tee >(tcextract -t vob -x mpeg2 > mozi.m2v) >(tcextract -t vob -x ac3 > mozi.ac3) > /dev/null
mplex -f 8 -o mozi.mpg mozi.m2v mozi.ac3
A
>()
segítségével (nem kell szóköz a zárójel elé!) ügyesen össze tudjuk kötni a
tee
parancsot és a
tcextract
parancsokat (a
-i
kapcsolóra azért nincsen szükség, mert
tcextract
nem fájlból, hanem standard inputról olvas). Érdemes még megjegyezni, hogy a process helyettesítés (process substitution) nem összekeverendő a parancsbehelyettesítéssel (command substitution).