কীভাবে 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 

যদিও এটি পুরো পাইপলাইনের জন্য এটি পরিচালনা করে না। আমি পুরো পাইপলাইনগুলির পক্ষে এটি সম্ভব করে তুলতে চাই, সম্ভবত এটি অন্যান্য শেলগুলিতে আনুন।
পিএসকোকিক

3
স্যানিটি পরীক্ষা করার জন্য, আপনি কি kshইনস্টল করেছেন? আমি যখন আপনার কোডটি চালান আমি যে 0কোনও শেল ইনস্টল না করে পেয়ে যাই
এরিক রেনুফ

1
@ এরিকরেনুফ লোল, হ্যাঁ আমি করি। এবং এটি স্টাফও করে না। ;)
পিএসকোকিক

উত্তরদাতারা স্ট্যাকওভারফ্লো . com/ প্রশ্নগুলি / 14686872 পড়তে চাইতে পারেন ।
জেডিবিপি

উত্তর:


13

কাঁটাচামচ এড়ানোর জন্য Ksh93 অনেক কিছু করে। আমি জানি না যে এটি কীভাবে প্রথম কেস পরিচালনা করতে জানে, যেমন trussএটি কেবল write(2)চূড়ান্ত ফলাফলের সাথে একটি কলকে কল করে।

এটি ডেভিড ম্যাক্রো.কে কমান্ডটি স্ক্যান করতে পারে এবং জানে যে তিনি অভ্যন্তরীণভাবে "প্রতিধ্বনি" পরিচালনা করতে পারেন handle

আমি যা বলতে পারি তা হ'ল আমি গত বছর "বোর্ন শেল" এর পার্সার এবং দোভাষীকে নতুন করে লিখেছিলাম এবং প্রধানত কাঁটাচামড়ার সংখ্যা হ্রাস করেছি এবং অনেকগুলি কাঁটাচামচ vfork()কল দ্বারা প্রতিস্থাপন করেছি । এটি বর্তমানে বর্ন শেলকে দ্বিতীয় দ্রুততম শেলটি কেএস93-এর আগের হিসাবে তৈরি করে। আপনি boshপাশাপাশি আপনার পরীক্ষা চালাতে পছন্দ করতে পারেন ।

বিটিডাব্লু: ksh93 সাধারণত কাঁটাচামচ এড়ানো হয়। এটি এমন একটি কাঠামো প্রয়োগ করে যা পূর্ববর্তী সমস্ত বৈশ্বিক ভেরিয়েবলগুলি ধারণ করে এবং শেল কোডটিকে "গ্লোবাল" ভেরিয়েবল স্ট্রাকচার পয়েন্টারের বিভিন্ন উদাহরণ হিসাবে ডাকা হলে শেল কোডটিকে পুনরায় প্রেরণ করে।

এই পদ্ধতিটি যখনই সাব-শেল রয়েছে তখন ksh93 দ্বারা ব্যবহৃত হয় (cmd)

এই পুনর্লিখনের কারণ হ'ল ডেভিড তার ল্যাপটপে উইন-ডস ব্যবহার করছেন এবং তিনি ধীর সাইগউইনকে পছন্দ করেন না, তাই তিনি ইউউইউএন লিখেছিলেন এবং সরাসরি উইন-ডস-এ ksh93 ব্যবহার করেন। fork()উইন-ডসের কোনও কারণ নেই , তাই তার একটি নতুন সমাধান খুঁজে বের করা প্রয়োজন ...

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.