এই বৈশিষ্ট্যটি প্রথম চালু করা হয়েছিল ksh
(ksh86 এ প্রথম নথিভুক্ত) এবং /dev/fd/n
বৈশিষ্ট্যটি ব্যবহার করা হচ্ছে (কিছু বিএসডি এবং এটিএন্ডটি সিস্টেমের মধ্যে স্বাধীনভাবে যুক্ত হয়েছিল)। ইন ksh
এবং ksh93u পর্যন্ত, এটা কাজ যদি না আপনার সিস্টেম সমর্থনের জন্য, / dev / FD / N ছিল করত না। zsh, বাশ এবং ksh93u+
তারও বেশি উপরে অস্থায়ী নামযুক্ত পাইপগুলি ব্যবহার করা যেতে পারে (আমি বিশ্বাস করি যে সিসিআইআই তে যুক্ত নামযুক্ত পাইপগুলি) যেখানে / ডিভ / এফডি / এন উপলব্ধ নেই।
যেসব সিস্টেমে উপলব্ধ রয়েছে (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 পয়েন্ট লিনাক্সে কাজ করে না।
যদিও পসিক্স নির্দিষ্ট করে না । এটি নামযুক্ত পাইপ নির্দিষ্ট করে না। নামক পাইপগুলি ফাইল পাইপগুলি থেকে অ্যাক্সেস করতে পারলে সাধারণ পাইপের মতো কাজ করে। এখানে সমস্যাটি হ'ল আপনাকে অস্থায়ী ফাইল তৈরি করতে হবে এবং তারপরে পরিষ্কার করতে হবে যা নির্ভরযোগ্যভাবে করা কঠিন, বিশেষ করে বিবেচনা করে যে অস্থায়ী ফাইল বা ডিরেক্টরি তৈরি করার জন্য পসিক্সের কোনও স্ট্যান্ডার্ড মেকানিজম নেই ( যেমন কিছু সিস্টেমে পাওয়া গেছে), এবং সিগন্যাল বহনযোগ্যভাবে পরিচালনা করছেন (হ্যাং-আপ বা মেরে ক্লিন-আপ করা) বহনযোগ্যভাবে করাও শক্ত।/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"
(এখানে সিগন্যাল পরিচালনার যত্ন নিচ্ছেন না))