यह सुविधा ksh
पहले (ksh86 में प्रलेखित) द्वारा पेश की गई थी और इस /dev/fd/n
सुविधा का उपयोग कर रही थी (पहले कुछ बीएसडी और एटी एंड टी सिस्टम में स्वतंत्र रूप से जोड़ा गया था)। में ksh
और ksh93u तक, यह तब तक काम नहीं करेगा जब तक कि आपके सिस्टम के पास / dev / fd / n के लिए समर्थन न हो। zsh, bash और ksh93u+
इसके बाद के संस्करण अस्थायी नाम वाले पाइपों का उपयोग कर सकते हैं (SysIII में जोड़े गए पाइपों का नाम) मेरा मानना है कि जहां / dev / fd / n उपलब्ध नहीं हैं।
जहां उपलब्ध सिस्टम पर (POSIX उन लोगों को निर्दिष्ट नहीं करता है), आप स्वयं के साथ प्रक्रिया प्रतिस्थापन ( ) कर सकते हैं :/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
हालाँकि जो ksh93
लिनक्स पर काम नहीं करता है , वहीं शेल पाइप को सॉकेट के साथ पाइप के बजाय लागू किया जाता है और ओपनिंग /dev/fd/3
जहां एक सॉकेट में 3 अंक लिनक्स पर काम नहीं करता है।
हालांकि POSIX निर्दिष्ट नहीं करता है । यह नामित पाइपों को निर्दिष्ट करता है। नामित पाइप सामान्य पाइप की तरह काम करते हैं सिवाय इसके कि आप उन्हें फ़ाइल सिस्टम से एक्सेस कर सकते हैं। यहाँ मुद्दा यह है कि आपको अस्थायी बनाना होगा और बाद में सफाई करनी होगी जो विशेष रूप से मज़बूती से करने के लिए कठिन है विशेष रूप से यह देखते हुए कि अस्थायी फ़ाइलों या निर्देशिकाओं को बनाने के लिए POSIX का कोई मानक तंत्र नहीं है (जैसे कुछ सिस्टम पर पाया जाता है), और सिग्नल हैंडलिंग को आंशिक रूप से करना। (हैंग-अप या किल को साफ करने के लिए) आंशिक रूप से करना भी कठिन है।/dev/fd/n
mktemp -d
आप कुछ ऐसा कर सकते हैं:
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"
(यहां सिग्नल हैंडलिंग का ध्यान नहीं रखना)।