বাশ স্ক্রিপ্টের জন্য 'Ctrl + c' ট্র্যাপ করুন তবে এই স্ক্রিপ্টটিতে প্রক্রিয়াটি খোলার জন্য নয়


11

আমি ব্যাশ স্ক্রিপ্টে একটি ইন্টারেক্টিভ প্রোগ্রাম করার চেষ্টা করেছি:

my_program

এবং আমি এটি 'Ctrl + c' দিয়ে বন্ধ করতে সক্ষম হতে চাই। আমি যখন এটি করি তবে আমার স্ক্রিপ্টটিও বন্ধ হয়ে যাচ্ছে।

আমি সম্পর্কে জানি।

trap '' 2
my_program
trap 2

তবে এই ক্ষেত্রে আমি কেবল my_programCtrl + c দিয়ে বন্ধ করতে পারি না ।

কোনও প্রোগ্রামে কীভাবে Ctrl + c এর অনুমতি দেওয়া যায়, তবে স্ক্রিপ্টটি এটি বন্ধ করে দেওয়া যায় না সে সম্পর্কে কী আপনার ধারণা আছে?

সম্পাদনা: উদাহরণ যোগ করুন

#!/bin/bash
my_program
my_program2

তাহলে আমি বন্ধ করার জন্যে ব্যবহার Ctrl + C my_program, my_program2মৃত্যুদন্ড কার্যকর করা হয় না কারণ পুরো স্ক্রিপ্ট থেকে প্রস্থান করা হয়।

উত্তর:


13

আপনার ব্যবহার করা উচিত trap true 2বা trap : 2পরিবর্তে trap '' 2। বাশ শেলের "সহায়তা ফাঁদ" এ সম্পর্কে যা বলেছে তা:

যদি এআরজি নুল স্ট্রিং হয় তবে প্রতিটি SIGNAL_SPEC শেল এবং এটির আদেশ অনুসারে উপেক্ষা করা হবে

উদাহরণ:

$ cat /tmp/test
#! /bin/sh
trap : INT
cat
echo first cat killed
cat
echo second cat killed
echo done
$ /tmp/test
   <press control-C>
^Cfirst cat killed
   <press control-C>
^Csecond cat killed
done

2
কিভাবে হত্যা সম্পর্কে tailগুলি পরিবর্তে পরের বার বিড়াল খুন করলে কী?
kubanczyk

12

ট্র্যাপ কমান্ডটি -তার ক্রিয়া যুক্তি হিসাবে দিয়ে আপনি কোনও ট্র্যাপটিকে তার ডিফল্টে পুনরায় সেট করতে পারেন । আপনি যদি এটি একটি সাব- শেলের মাধ্যমে করেন তবে এটি প্যারেন্ট শেলের ফাঁদকে প্রভাবিত করবে না। আপনার স্ক্রিপ্টে, আপনি প্রতিটি কমান্ডের জন্য এটি করতে পারেন যা আপনাকে সিটিটিএল-সি দিয়ে বাধা দেওয়া দরকার:

#!/bin/bash
# make the shell (and its children) ignore SIGINT
trap '' INT
.
.
.
# but this child won't ignore SIGINT
(trap - INT; my_program)
# the rest of the script is still ignoring SIGINT
.
.
.

1
যদিও স্বীকৃত উত্তরটি শেলের পক্ষে সম্ভবত আরও ভাল এবং আরও প্রচলিত, তবে এটি নিজের মধ্যে একটি দুর্দান্ত উত্তর যেটি এই ধরণের সিগন্যাল মাস্কিং / নিরাপদে উপেক্ষা করার জন্য কীভাবে সাধারণ নীতিটি (শেল-নির্দিষ্ট নয়) পরিচয় করিয়ে দেয়।
আর .. গীটহাব স্টপ হেল্পিং আইসিসি

আমার ধারণা আপনি exec my_programকিছুটা দক্ষ হয়ে উঠতে পারবেন he
টবির গতি

@ আর .. এটি একেবারে শেল নির্দিষ্ট নয় - আপনি যদি SIG_IGN- এ একটি সিগন্যাল সেট করেন (খালি স্ট্রিংয়ের সাথে এটিই ফাঁদটি করছে), সেই রাষ্ট্রটি SIGCHLD ব্যতীত এক্সিকিউট () এর মাধ্যমে উত্তরাধিকার সূত্রে প্রাপ্ত হবে। এটি পসিক্স বাধ্যতামূলক আচরণ। আরও দেখুন উত্তর stackoverflow.com/questions/32708086/...
mosvy

@ মোসবি: আমার মন্তব্যের কোন অংশের সাথে আপনি একমত নন তা আমি দেখতে পাচ্ছি না। আমার পুরো বক্তব্যটি ছিল "কাঁটাচাঁটি করার আগে মাস্ক / উপেক্ষা করা, নির্বাহী হওয়ার আগে শিশুটিতে আনমাস্ক / আনইনগোর" একটি সাধারণ নীতি যা কেবল শেল প্রোগ্রামিংয়ের প্রেক্ষাপটের বাইরে জানার জন্য দরকারী।
আর .. গীটহাব স্টপ হেল্পিং আইসিসি

1
এটি একটি খুব দরকারী উত্তর। অভিজ্ঞ লিনাক্স ব্যবহারকারী হিসাবে আমি বলতে পারি যে এর আগে আমি এর আগে কখনও শুনিনি। এটির প্রচুর ব্যবহার রয়েছে ... আপনি আমার উপগ্রহ এবং আমার বুকমার্ক পেয়েছেন।
দেব

-1


আপনি যখন Crtl+ ব্যবহার করেন C, আপনি প্রোগ্রামটিকে বাধা দিন (এটি " হত্যা ") করুন।
আপনি সম্ভবত যা খুঁজছেন তা হ'ল আপনার প্রোগ্রামটি স্থগিত করা (এটি " বিরতি দিন ")। এর জন্য, আপনি Crtl+ ব্যবহার করতে পারেন Z
আপনার প্রোগ্রামটি বিরতি দেওয়ার পরে আপনি এটি ব্যবহার করে দেখতে পারেন jobs। উদাহরণস্বরূপ:
[1]+ Stopped ./foobar
এখানে আমার কেবল একটি চাকরী আছে, কাজ # 1, তবে একের অধিক থাকতে পারে - প্রতিটি কাজের নিজস্ব নম্বর রয়েছে।
আপনি কয়েকটি কমান্ড ব্যবহার করে আপনার স্থগিত প্রক্রিয়াটি নিয়ন্ত্রণ করতে পারেন, উদাহরণস্বরূপ bg, fgএবং kill
bg %1চাকরিটি 1 বি- এসি- জি রাউন্ডে
fg %1পুনঃসূচনা করবে তখন আকরিকের # 1 টি পুনঃসূচনা করবেজি রাউন্ডটি
kill %1চাকরিটি # 1 কে মেরে ফেলবে
নোট করুন যে আপনি যদি কেবলমাত্র একটি সক্রিয় কাজ থাকেন তবে আপনি ব্যবহার করতে পারবেন bgএবং fgকোনও যুক্তি ছাড়াই।


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