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
वहां, हम fd 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
@jimmij द्वारा सुझाए गए अनुसार एक बाहरी रनिंग या कुछ जोड़ना sleep
, लेकिन यह अभी भी बहुत मजबूत नहीं होगा, या आप प्रत्येक के बाद नामित पाइप को फिर से बना सकते हैं echo
:
while
mkfifo $fifo &&
echo $((++incr)) > $fifo &&
rm -f $fifo
do : nothing
done &
यही कारण है कि अभी भी कम खिड़कियों जहां पाइप मौजूद नहीं है (के बीच छोड़ देता है unlink()
के द्वारा किया जाता rm
है और mknod()
के द्वारा किया mkfifo
) के कारण cat
विफल, और बहुत ही कम खिड़कियों जहां पाइप instantiated कर दिया गया है, लेकिन कोई प्रक्रिया कभी यह करने के लिए फिर से लिखेंगे (के बीच 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
जब तक यह सिस्टम पर सभी उपयोगकर्ताओं के सामने आने वाली सेवा नहीं है , तब तक मैं विश्व के योग्य निर्देशिकाओं में निश्चित नाम, विश्व पठनीय पंद्रह (या उस मामलों के लिए कोई भी फ़ाइल) बनाने के खिलाफ सलाह दूंगा ।