Ksh93 कमांड प्रतिस्थापन में कांटे से कैसे बचता है


12

दिया हुआ

cmd='fun(){ echo "$@";  }; fun $(fun $(fun hi))'

गोले बनाने के लिए 2 कांटे बनाने की आवश्यकता होती है

strace-f(){ strace -f "$@" 2>&1; }; 
for sh in dash bash zsh ksh; do 
    printf "$sh\t" ; strace-f $sh -c "$cmd"  |grep -e clone -e fork -c;
done

सिवाय kshवीरता के एक बार फोर्क किए बिना बना देता है:

dash    2
bash    2
zsh     2
ksh     0

इससे ऐसा कैसे होता है?


संपादित करें:

यहां बताया गया है कि यह एक पाइप के साथ नीचे कैसे जाता है:

cmd='fun(){ echo "$@"| echo "$@";  }; fun $(fun $(fun hi))'

आउटपुट:

dash    11
bash    10
zsh     5
ksh     3 

हालांकि यह पूरी पाइपलाइनों के लिए इसका प्रबंधन नहीं करता है। मैं इसे पूरी पाइपलाइनों के लिए संभव बनाना चाहता हूं, संभवतः इसे अन्य गोले में लाऊंगा।
PSkocik

3
सिर्फ स्वच्छता जाँच के लिए, क्या आपने kshस्थापित किया है? जब मैं आपका कोड चलाता 0हूं तो मुझे किसी भी शेल के लिए मिलता है जिसे मैंने स्थापित नहीं किया है
एरिक रेनॉफ

1
@ EricRenouf योग्य, हाँ मैं करता हूँ। और यह सामान भी करता है। ;)
पीएसकोइक

उत्तरदाता से पढ़ सकते हैं stackoverflow.com/questions/14686872
JdeBP

जवाबों:


13

Ksh93 कांटे से बचने के लिए बहुत कुछ करता है। मुझे पता नहीं है कि यह कैसे जानता है कि पहले मामले को कैसे संभालना है, एक trussशो के रूप में कि यह केवल write(2)अंतिम परिणाम के साथ एक कॉल करता है।

यह हो सकता है कि डेविड मैक्रो में कमांड को स्कैन करता है और जानता है कि वह आंतरिक रूप से "इको" को संभाल सकता है।

मैं क्या कह सकता हूं कि मैंने पिछले साल "बॉर्न शेल" के पार्सर और व्याख्याकार को फिर से लिखा था और मुख्य रूप से कांटे की संख्या कम कर दी थी और vfork()कॉल के द्वारा कई कांटे बदल दिए थे । यह वर्तमान में बॉर्न शेल को ksh93 का दूसरा सबसे तेज शेल बनाता है। आप अपने परीक्षणों को भी चलाना पसंद कर सकते हैं bosh

BTW: ksh93 सामान्य रूप से कांटे से बचा जाता है। यह एक संरचना को लागू करता है जिसमें सभी पिछले वैश्विक चर शामिल हैं और इसने शेल कोड को फिर से बनाया है अगर इसे "वैश्विक" चर संरचना सूचक के विभिन्न उदाहरणों के साथ कहा जाता है।

इस विधि का उपयोग ksh93 द्वारा किया जाता है जब भी कोई सबस्क्रिप्शन होता है (cmd)

इस पुनर्लेखन का कारण यह है कि डेविड अपने लैपटॉप पर विन-डॉस का उपयोग कर रहा है और उसे धीमे साइगविन पसंद नहीं थे, इसलिए उसने यूडब्ल्यूआईएन लिखा और सीधे विन-डॉस पर ksh93 का उपयोग करता है। चूंकि fork()विन-डॉस पर कोई बात नहीं है , उन्हें एक नया समाधान खोजने की जरूरत थी ...

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.