স্থগিত হওয়ার পরে কিছুক্ষণ লুপ কেন থামবে?


10

কেন এটি হল যে ব্যাশ ব্যবহার করা এবং কিছুক্ষণের জন্য লুপ স্থগিত করা, লুপটি আবার শুরু হওয়ার পরে বন্ধ হয়ে যায়? নীচে সংক্ষিপ্ত উদাহরণ।

$ while true; do echo .; sleep 1; done
.
.
^Z
[1]+  Stopped                 sleep 1
$ fg
sleep 1
$

আমি সংকেতগুলির সাথে পরিচিত, এবং আমি অনুমান করছি এটি এখানে বাশের প্রাকৃতিক আচরণ হতে পারে তবে আমি কেন এটি এই বিশেষ পদ্ধতিতে আচরণ করে তা আরও ভালভাবে বুঝতে চাই।


কারণ এটি একটি বিঘ্নিত পরিচালনা করতে হবে এবং সঠিকভাবে প্রতিফলিত করতে হবে যে বিনিময়ে $?, এবং তাই trueনা true। সম্ভবত। আমি মনে করি.
মাইকজার্ভ

1
আমি আশা করি এই মন্তব্যটি পতাকাঙ্কিত হবে না, তবে আমি ইউনিক্স কোয়ান-স্টাইলে অন্য প্রশ্নের সাথে আপনার প্রশ্নের জবাব দেব: "স্থগিত হওয়ার পরে কেন একজন শিক্ষার্থী খেলার মাঠে লড়াই বন্ধ করে দেয়?" উত্তরটি হ'ল, কারণ তিনি আর খেলার মাঠে নেই যেখানে লড়াই শুরু করার ক্ষমতা রয়েছে। সুতরাং, প্রশ্নের মধ্যে থাকা আচরণটি কেবল থামানো হয়েছে।
রুবিনোরেল

আপনি আদেশটি থামান, লুপটি ভেঙে গেছে। তারপরে আপনি লুপ নয়, একক স্লিপ 1 কমান্ডটি আবার চালু করুন।
123

উত্তর:


10

এটি বেশ কয়েকটি শেলের মধ্যে বাগের মতো দেখায়, এটি ksh93 এবং zsh এর সাথে প্রত্যাশা অনুযায়ী কাজ করে ।

পটভূমি:

বেশিরভাগ শেলগুলি মূল শেলের ভিতরে লুপটি চালিয়ে যায় বলে মনে হয় এবং

আপনি যদি লগ-ইন না করে শেল দিয়ে ^ Z টাইপ করেন তবে বোর্ন শেল পুরো শেলটি সাসপেন্ড করে

বাশ কেবলমাত্র স্থগিত করে sleepএবং তারপরে একটি নতুন শেল প্রম্পট মুদ্রণের পক্ষে লুপটি ছেড়ে দেয়

ড্যাশ এই কমান্ডটিকে অস্বীকারযোগ্য করে তোলে

সঙ্গে ksh93 , জিনিষ খুব ভিন্ন কাজ:

ksh93 একই কাজ করে, কমান্ডটি প্রথমবার শুরু হওয়ার সাথে সাথে, তবে sleepksh93-তে বুটিন হিসাবে, ksh93 এর একটি হ্যান্ডলার রয়েছে যার ফলে লুপটি মূল শেলটি কাঁটাচামচ করে দেয় এবং তারপরে আপনি যখন ^ Z টাইপ করেন তখন সাসপেন্ড হয়।

আপনি যদি পরে ksh93 টাইপ করেন তবে লুপটি চালিত ফরকডfg অফ চাইল্ড অবিরত থাকবে।

বাশ এবং ksh93 এর জবকন্ট্রোল বার্তাগুলির তুলনা করার সময় আপনি মূল পার্থক্যটি দেখতে পান:

বাশ রিপোর্ট:

[1]+ Stopped sleep 1

তবে ksh93 রিপোর্ট:

^Z[1] + Stopped while true; do echo .; sleep 1; done

zsh ksh93 এর মতো আচরণ করে

উভয় শেল দিয়ে আপনি যতক্ষণ না ^ Z টাইপ না করেন ততক্ষণ আপনার একটি একক প্রক্রিয়া (মূল শেল) থাকে এবং ^ Z টাইপ করার পরে দুটি শেল প্রক্রিয়া থাকে।


dashলুপটি শেষ হয়ে গেলে আসলে সিগন্যালটি পরিচালনা করে না ? মধ্যে [d]?ashসোর্স কোড জন্য এই ম্যাক্রো সব আছে INTON এবং INTOFF ছড়িয়ে, এবং একটি ইন সাধারণত গৃহীত সংকেত INTOFF রাষ্ট্র সত্যিই পরিচালনা করা হয় (অথবা কাছাকাছি) INTON । যাইহোক, আমি কেবল কৌতূহল কারণ আমি মনে করি আপনি আরও ভাল জানেন - এটি দুর্দান্ত উত্তর। ধন্যবাদ.
মাইকজার্ভ

আমি খুব কমই ড্যাশ ব্যবহার করি এবং আমি সম্প্রতি এটিকে বাশ, ksh93 এবং আমার বোর্ন শেলের সাথে পারফরম্যান্স তুলনার জন্য এনেছি এবং সংকলন করেছি। এই পরীক্ষাগুলি করার সময়, আমি আবিষ্কার করেছি যে ড্যাশগুলি প্রধানত দ্রুত বলে মনে হয় কারণ এতে মাল্টি বাইট অক্ষরের জন্য সমর্থন অন্তর্ভুক্ত নয়। একটি অবিবাহিতকে sleep 100স্থগিত করা এবং পুনরায় চালু করা যেতে পারে dash, সুতরাং মনে হয় যে dashএই আদেশে সমস্যাগুলি সম্পর্কে জানে এবং বেছে বেছে কাজ নিয়ন্ত্রণ অক্ষম করে।
সহজেই

সুতরাং, আপনার পরীক্ষাগুলিতে, আপনি dashমাল্টিবাইট প্রসেসিং বাদ দিয়ে অন্যান্য শেলগুলিতে পারফরম্যান্সের সমান করতে সক্ষম হয়েছিলেন ? এবং হ্যাঁ, dashজব নিয়ন্ত্রণকে সমর্থন করে, তবে স্ট্যান্ডার্ডটি বলেছে যে একটি ইন্টারেক্টিভ শেলটি টিএসটিপিকে উপেক্ষা করবে এবং একটি ইন্টারেক্টিভ টার্মিনালে বর্তমান শেলটিতে কিছুক্ষণ লুপ চালানো অন্য কোনওটির চেয়ে কম ইন্টারেক্টিভ শেল নয়।
মাইকজার্ভ

আমি এটি ঠিক পরীক্ষা করে দেখিনি, তবে আমি দেখতে পেলাম যে ড্যাশ যখন ksh93 বা বোর্ন শেলটির চেয়ে বেশি সিস্টেম সিপিইউ সময় গ্রহন করে (মূলত এটি আরও কাঁটাচামচ () কল দেয়) তবে এটি ব্যবহারকারীর সিপিইউ সময় কম ব্যবহার করে এবং একই ফলাফলের ফলাফল বোর্ন শেলের আমার সংস্করণটির সাথে তুলনা করে সিপিইউ সময়। বোর্ন শেল ব্যবহারকারীর সিপিইউ সময় হ্রাস করার চেষ্টা থেকে, আমি জানি যে বেশিরভাগ সময়টি মাল্টিবাইট রূপান্তরগুলিতে ব্যয় করে।
ধীরে ধীরে

4

আমি ইস্যুটি সম্পর্কে বাশের অন্যতম সহ-লেখককে লিখেছি এবং এখানে তার উত্তর:

এটি আসলে কোনও বাগ নয়, তবে এটি অবশ্যই একটি সতর্কতামূলক বিষয়।

এখানে ধারণাটি হ'ল আপনি প্রক্রিয়াগুলিকে স্থগিত করেন যা শেল কমান্ডের চেয়ে গ্রানুলারিটির আলাদা একক। যখন কোনও প্রক্রিয়া স্থগিত করা হয়, তখন এটি শেলের কাছে ফিরে আসে (একটি শূন্য নয় এমন স্থিতি সহ, যার পরিণতি হয় যখন আপনি বলুন যে লুপ টেস্টের প্রক্রিয়াটি থামান), যার একটি পছন্দ রয়েছে: এটি লুপটি ভেঙে বা চালিয়ে যেতে পারে , থামানো প্রক্রিয়া পিছনে রেখে। বাশ যখন কোনও কাজ বন্ধ হয়ে যায় তখন লুপগুলি ভেঙে ফেলার জন্য - এবং সর্বদা পছন্দ করে - বেছে নিয়েছে। লুপ চালিয়ে যাওয়া আপনি যা চান তা খুব কমই হয়।

কিছু অন্যান্য শেলগুলি কাজ করে যেমন শেগস্টপির কারণে কোনও প্রক্রিয়া স্থগিত হয়ে গেলে শেলের একটি অনুলিপি কাঁটাচামচ করে এবং প্রক্রিয়াটি বন্ধ করে দেয়। বাশ এটি কখনও করেন নি - এটি বেনিফিট ওয়ারেন্টগুলির চেয়ে জটিল বলে মনে হচ্ছে - তবে যদি কেউ এই কোডটি প্যাচ হিসাবে জমা দিতে চায় তবে আমি পরিবর্তনগুলি সংযুক্ত করে একবার দেখে নিই।

সুতরাং কেউ যদি কোনও প্যাচ জমা দিতে চান তবে ম্যান পৃষ্ঠাগুলিতে পাওয়া ইমেল ঠিকানাগুলি ব্যবহার করুন।

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