কি হবে যে উভয় bash
এবং ping
SIGINT পান ( bash
হচ্ছে না ইন্টারেক্টিভ, উভয় ping
এবং bash
একই প্রক্রিয়া গ্রুপ যা ইন্টারেক্টিভ শেল আপনার কাছ থেকে স্ক্রিপ্ট দৌড়ে দ্বারা তৈরি করা হয়েছে এবং সেট টার্মিনালের ফোরগ্রাউন্ড প্রক্রিয়া দল হিসেবে চালানোর)।
যাইহোক, bash
বর্তমানে চলমান কমান্ডটি প্রস্থান হওয়ার পরে কেবলমাত্র অ্যাসিঙ্ক্রোনিকভাবে সাইন ইন করে পরিচালনা করে। bash
কেবলমাত্র সইগিন্ট প্রাপ্তির পরে যদি বর্তমান চলমান কমান্ডটি একটি সাইন্টের (যেমন এর প্রস্থান স্থিতিটি ইঙ্গিত করে যে এটি স্বাক্ষর দ্বারা হত্যা করা হয়েছে) মারা যায়।
$ bash -c 'sh -c "trap exit\ 0 INT; sleep 10; :"; echo here'
^Chere
সর্বোপরি, bash
, sh
এবং sleep
SIGINT যখন আমি Ctrl-C, টিপুন, গ্রহণ কিন্তু sh
প্রস্থানের 0 প্রস্থান কোড সহ স্বাভাবিকভাবে, তাই bash
SIGINT উপেক্ষা করে, যার কারণে আমরা "এখানে" দেখুন।
ping
, কমপক্ষে আইপুইটস থেকে একজন, এর মতো আচরণ করে। বাধা দেওয়া হলে, এটি পরিসংখ্যানগুলি মুদ্রণ করে এবং এর পিংস উত্তর দেওয়া হয়েছিল কিনা তার উপর নির্ভর করে 0 বা 1 প্রস্থান স্থিতি দিয়ে প্রস্থান করে। সুতরাং, যখন আপনি ping
চলমান অবস্থায় Ctrl-C টিপুন , bash
নোটগুলি নোট করে যে আপনি Ctrl-C
এর সিগিন্ট হ্যান্ডলারগুলিতে চাপ দিয়েছেন , তবে যেহেতু ping
স্বাভাবিকভাবে প্রস্থান হয়, bash
প্রস্থান হয় না।
যদি আপনি sleep 1
সেই লুপটিতে একটি জুড়েন এবং চলমান Ctrl-C
অবস্থায় টিপুন sleep
, কারণ sleep
সাইন্টে কোনও বিশেষ হ্যান্ডলার নেই, তবে এটি মারা যাবে এবং রিপোর্ট করবে bash
যে এটি একটি সাইন্টের কারণে মারা গেছে, এবং সেই ক্ষেত্রে bash
প্রস্থান করবে (এটি আসলে সাইন্টের সাহায্যে নিজেকে মেরে ফেলবে) বাধাকে তার পিতামাতার কাছে রিপোর্ট করতে)।
কেন bash
এরকম আচরণ করে তা সম্পর্কে, আমি নিশ্চিত নই এবং আমি নোট করি যে আচরণটি সর্বদা নিরস্তকর নয়। আমি কেবল বিকাশ মেলিং তালিকায় প্রশ্নটিbash
জিজ্ঞাসা করেছি ( আপডেট : @ জিলস এখন তার উত্তরে কারণটি পেরেক দিয়েছেন )।
আমি কেবলমাত্র অন্য শেলটি দেখতে পেলাম যে একইভাবে আচরণ করে তা হ'ল ksh93 (আপডেট, @ জিলিস দ্বারা উল্লিখিতsh
, যেমন ফ্রিবিএসডিও করে )। সেখানে, SIGINT স্পষ্টভাবে উপেক্ষা করা হবে বলে মনে হচ্ছে। এবং ksh93
যখনই একটি কমান্ড স্বাক্ষর দ্বারা নিহত হয় তখন উপস্থিত হয়।
আপনি bash
উপরের মতো একই আচরণ পান তবে:
ksh -c 'sh -c "kill -INT \$\$"; echo test'
"পরীক্ষা" আউটপুট দেয় না। এটি হ'ল এটি সাইন্টের সাথে মারা যাওয়ার অপেক্ষায় থাকা কমান্ডটি স্বাক্ষর না করলেও (সাইন্টের সাথে নিজেকে মেরে সেখানে) বেরিয়ে যায়, এমনকি যদি তা নিজেই সেই সাইনটি না পায়।
চারপাশের কাজটি হ'ল একটি যুক্ত করা:
trap 'exit 130' INT
bash
একটি সাইন ইন পাওয়ার পরে স্ক্রিপ্টের শীর্ষে প্রস্থান করার জন্য চাপ দিন (নোট করুন যে কোনও ক্ষেত্রে সাইন ইন সিঙ্ক্রোনসিভ প্রক্রিয়া করা হবে না, কেবলমাত্র বর্তমানে চলমান কমান্ডটি বেরিয়ে আসার পরে)।
আদর্শভাবে, আমরা আমাদের পিতামাতাকে জানাতে চাই যে আমরা একটি স্বাক্ষরের কারণে মারা গিয়েছি (যাতে এটি অন্য কোনও স্ক্রিপ্ট হয় তবে bash
সেই bash
স্ক্রিপ্টটিও বাধাগ্রস্ত হয়)। একটি এরকম exit 130
(যদিও কিছু শাঁস সেট হবে SIGINT মৃত্যু হিসাবে একই নয় $?
তবে এটা প্রায়ই SIGINT দ্বারা একটি মৃত্যুর রিপোর্ট করতে (সিস্টেমে যেখানে SIGINT 2 যা সর্বাধিক হয়) জন্য ব্যবহার করা হয়ে, উভয় ক্ষেত্রেই একই মান)।
তবে bash
, ksh93
বা ফ্রিবিএসডি এর পক্ষে sh
এটি কার্যকর হয় না। সেই 130 প্রস্থান স্থিতিটিকে সাইন্ট দ্বারা মৃত্যু হিসাবে বিবেচনা করা হবে না এবং সেখানে কোনও পিতামহ স্ক্রিপ্ট বাতিল করা হবে না ।
সুতরাং, সম্ভবত আরও ভাল বিকল্প হ'ল স্বাক্ষর পাওয়ার পরে স্বাক্ষর দিয়ে নিজেকে হত্যা করা:
trap '
trap - INT # restore default INT handler
kill -s INT "$$"
' INT
for f in *.txt; do vi "$f"; cp "$f" newdir; done
। যদি ব্যবহারকারী কোনও ফাইল সম্পাদনার সময় Ctrl + C টাইপ করেন তবেvi
কেবল একটি বার্তা প্রদর্শিত হবে। এটি যুক্তিসঙ্গত বলে মনে হয় যে ব্যবহারকারী ফাইল সম্পাদনা শেষ করার পরে লুপটি চালিয়ে যাওয়া উচিত। (এবং হ্যাঁ, আমি জানি যে আপনি বলতে পারেনvi *.txt; cp *.txt newdir
; আমিfor
উদাহরণ হিসাবে কেবল লুপটি জমা দিচ্ছি ))