ksh93
সাধারণত এই ধরণের জিনিসটির জন্য ব্যবহার করা হয় এমন শাখা রয়েছে। এর মাধ্যমে zsh
, আপনি গতিশীল নামযুক্ত ডিরেক্টরি বৈশিষ্ট্যটি হাইজ্যাক করতে পারেন :
উদাহরণস্বরূপ সংজ্ঞা দিন:
zsh_directory_name() {
case $1 in
(n)
case $2 in
(incr) reply=($((++incr)))
esac
esac
}
এবং তারপরে আপনি প্রতিবার ~[incr]
ইনক্রিমেন্ট পেতে ব্যবহার করতে পারেন $incr
:
$ echo ~[incr]
1
$ echo ~[incr] ~[incr]
2 3
আপনার পন্থা ব্যর্থ হয়েছে কারণ head -1 /tmp/ints
, মাথাটি ফিফোটি খুলবে, একটি পূর্ণ বাফার পড়ে, একটি লাইন মুদ্রণ করে এবং তারপরে এটি বন্ধ করে দেয় । একবার বন্ধ হয়ে গেলে, লেখার শেষটি একটি ভাঙা পাইপ দেখায়।
পরিবর্তে, আপনি হয় করতে পারেন:
$ fifo=~/.generators/incr
$ (umask 077 && mkdir -p $fifo:h && rm -f $fifo && mkfifo $fifo)
$ seq infinity > $fifo &
$ exec 3< $fifo
$ IFS= read -rneu3
1
$ IFS= read -rneu3
2
সেখানে আমরা পড়ার শেষটি এফডি 3 এ খোলা রেখেছি এবং read
একবারে একটি বাইট পড়ি, ঠিক এক লাইনে (নতুন লাইনের চরিত্র পর্যন্ত) পড়ার বিষয়ে নিশ্চিত হওয়ার জন্য কোনও পূর্ণ বাফার নয়।
অথবা আপনি করতে পারেন:
$ fifo=~/.generators/incr
$ (umask 077 && mkdir -p $fifo:h && rm -f $fifo && mkfifo $fifo)
$ while true; do echo $((++incr)) > $fifo; done &
$ cat $fifo
1
$ cat $fifo
2
এই সময়, আমরা প্রতিটি মানের জন্য পাইপ ইনস্ট্যান্ট করি। এটি যে কোনও লাইন সংখ্যায় সংখ্যক তথ্য সম্বলিত ডেটা ফেরত দেয়।
যাইহোক, সেই ক্ষেত্রে, cat
ফিফোটি খোলার সাথে echo
সাথে লুপটি অবরুদ্ধ হয়ে যায়, তাই আরও echo
কিছুটা চালানো যেতে পারে, সময়ের cat
সাথে সাথে বিষয়বস্তুটি পড়ে এবং পাইপটি বন্ধ করে দেয় (এরপরে echo
একটি নতুন পাইপ ইনস্ট্যান্ট করার ফলে )।
চারপাশের কাজটি হতে পারে কিছুটা বিলম্ব যুক্ত করা যেমন উদাহরণস্বরূপ echo
@ জিম্মিজের পরামর্শ অনুসারে একটি বাহ্যিক চালানো বা কিছু যোগ করা sleep
, তবে এটি এখনও খুব দৃust় হবে না, বা আপনি প্রতিটি নামকরণ করা পাইপ পুনরায় তৈরি করতে পারেন echo
:
while
mkfifo $fifo &&
echo $((++incr)) > $fifo &&
rm -f $fifo
do : nothing
done &
এটি এখনও ছোট উইন্ডোজ ছেড়ে দেয় যেখানে পাইপটি অস্তিত্বহীন হয়ে থাকে ( unlink()
সম্পন্ন rm
এবং mknod()
সম্পন্ন mkfifo
হওয়াগুলির মধ্যে) cat
ব্যর্থ হওয়ার কারণ এবং খুব সংক্ষিপ্ত উইন্ডো যেখানে পাইপটি ইনস্ট্যান্ট করা হয়েছে তবে কোনও প্রক্রিয়া আর কখনও এটি লিখবে না (এবং write()
এবং এর মধ্যে) close()
দ্বারা সম্পন্ন echo
) ঘটাচ্ছে cat
কিছুই ফেরত দিতে, এবং সংক্ষিপ্ত কোথায় জানালা নামক নল এখনও বিদ্যমান কিন্তু কিছুই কি কখনো লেখার জন্য এটি খোলার হবে (মধ্যে close()
দ্বারা সম্পন্ন echo
এবং unlink()
দ্বারা সম্পন্ন rm
) যেখানে cat
স্তব্ধ হবে।
আপনি উইন্ডোজগুলির মধ্যে কিছুগুলি এর মতো করে মুছে ফেলতে পারেন:
fifo=~/.generators/incr
(
umask 077
mkdir -p $fifo:h && rm -f $fifo && mkfifo $fifo &&
while
mkfifo $fifo.new &&
{
mv $fifo.new $fifo &&
echo $((++incr))
} > $fifo
do : nothing
done
) &
এইভাবে, একমাত্র সমস্যাটি হ'ল যদি আপনি একই সাথে কয়েকটি বিড়াল চালান (আমাদের লেখার লুপটি লেখার জন্য এটি খোলার জন্য প্রস্তুত হওয়ার আগে তারা সমস্ত ফিফো খুলেন) তবে তারা echo
আউটপুটটি ভাগ করবে ।
আমি বিশ্ব লিখনযোগ্য ডিরেক্টরিতে স্থির নাম, বিশ্ব পঠনযোগ্য ফিফোস (বা সেই বিষয়ে কোনও ফাইল) তৈরির বিরুদ্ধেও পরামর্শ দেব /tmp
যতক্ষণ না এটি সিস্টেমের সমস্ত ব্যবহারকারীর সামনে উন্মুক্ত করা কোনও পরিষেবা।