Bu özellik ksh
(ilk olarak ksh86'da belgelenmiştir) tarafından tanıtılmıştır ve /dev/fd/n
özelliği kullanmıştır ( daha önce bazı BSD'lerde ve AT&T sistemlerinde bağımsız olarak eklenmiştir). Gelen ksh
ve ksh93u kadar, bu iş için sistem desteği için / dev / fd / n vardı sürece olmaz. zsh, bash ve ksh93u+
ve üstü / dev / fd / n'nin bulunmadığı geçici adlandırılmış boruları (inanıyorum SysIII'de eklenen isimli borular) kullanabilirler.
Mevcut olan sistemlerde (POSIX bunları belirtmez), işlem değiştirme işlemini kendiniz ( ) ile yapabilirsiniz:/dev/fd/n
diff <(cmd1) <(cmd2)
{
cmd1 4<&- | {
# in here fd 3 points to the reading end of the pipe
# from cmd1, while fd 0 has been restored from the original
# stdin (saved on fd 4, now closed as no longer needed)
cmd2 3<&- | diff /dev/fd/3 -
} 3<&0 <&4 4<&- # restore the original stdin for cmd2
} 4<&0 # save a copy of stdin for cmd2
Ancak bu ksh93
orada Linux ile çalışmaz , kabuk borular boru yerine /dev/fd/3
soket çiftleri ile uygulanır ve fd 3 noktalarının bir sokette Linux üzerinde çalışmadığı yerler açılır .
POSIX belirtmese de . Adlandırılmış yöneltmeler belirtir. Adlandırılmış borular, dosya sisteminden erişebilmeniz dışında normal borular gibi çalışır. Buradaki sorun, geçici olanları oluşturmanız ve daha sonra temizlemeniz gerektiğidir; bu, özellikle POSIX'in geçici dosyalar veya dizinler oluşturmak ve taşınabilir bir şekilde sinyal işleme yapmak için standart bir mekanizma ( bazı sistemlerde bulunanlar gibi) olmadığını göz önünde bulundurarak güvenilir bir şekilde yapmak zordur. (telefonu kapattıktan veya öldürdükten sonra temizlemek) de taşınabilir olarak yapmak zordur./dev/fd/n
mktemp -d
Gibi bir şey yapabilirsin:
tmpfifo() (
n=0
until
fifo=$1.$$.$n
mkfifo -m 600 -- "$fifo" 2> /dev/null
do
n=$((n + 1))
# give up after 20 attempts as it could be a permanent condition
# that prevents us from creating fifos. You'd need to raise that
# limit if you intend to create (and use at the same time)
# more than 20 fifos in your script
[ "$n" -lt 20 ] || exit 1
done
printf '%s\n' "$fifo"
)
cleanup() { rm -f -- "$fifo"; }
fifo=$(tmpfifo /tmp/fifo) || exit
cmd2 > "$fifo" & cmd1 | diff - "$fifo"
rm -f -- "$fifo"
(burada sinyal işleme ile ilgilenmiyor).