बैश स्क्रिप्ट के लिए ट्रैप '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 : 2trap '' 2

यदि ARG नल स्ट्रिंग है तो प्रत्येक 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

आप ट्रैप कमांड -को इसके एक्शन तर्क के रूप में एक डिफॉल्ट को इसके डिफॉल्ट पर रीसेट कर सकते हैं । यदि आप इसे किसी सबशेल में करते हैं , तो यह मूल शैल में जाल को प्रभावित नहीं करेगा। अपनी स्क्रिप्ट में, आप प्रत्येक कमांड के लिए ऐसा कर सकते हैं, जिसे आपको Ctrl-C के साथ बाधित करने की आवश्यकता है:

#!/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
जबकि स्वीकृत उत्तर शेल के लिए संभवतः बेहतर और अधिक विहित है, यह अपने आप में एक महान जवाब है कि यह इस तरह के सिग्नल मास्किंग / सुरक्षित रूप से अनदेखा करने के लिए सामान्य सिद्धांत (शेल-विशिष्ट नहीं) का परिचय देता है।
R .. गिटहब स्टॉप हेल्पिंग ICE

मुझे लगता है कि आप exec my_programउपधारा में, थोड़ा अधिक कुशल हो सकते हैं।
टोबी स्पाइट

@R .. यह बिल्कुल विशिष्ट नहीं है - यदि आप SIG_IGN के लिए एक संकेत सेट करते हैं (जो कि एक खाली स्ट्रिंग के साथ जाल कर रहा है), तो उस स्थिति को निष्पादन के माध्यम से विरासत में प्राप्त किया जाएगा (), सिगचल्ड को छोड़कर। यह POSIX अनिवार्य व्यवहार है। यह भी देखें का जवाब stackoverflow.com/questions/32708086/...
mosvy

@mosvy: मुझे नहीं लगता कि आप मेरी टिप्पणी के किस हिस्से से असहमत हैं। मेरा पूरा कहना यह था कि "कांटा लगाने से पहले नकाब / अनदेखी, बच्चे को फांसी देने से पहले अनमास्क / अनियंत्रित होना" एक सामान्य सिद्धांत है जो सिर्फ शेल प्रोग्रामिंग के संदर्भ में जानना उपयोगी है।
R .. गिटहब स्टॉप हेल्पिंग ICE

1
यह बहुत उपयोगी उत्तर है। एक अनुभवी लिनक्स उपयोगकर्ता के रूप में, मैं कह सकता हूं कि मैंने इसके बारे में पहले कभी नहीं सुना। इसके काफी उपयोग हैं ... आपको मेरा अपडाउन और मेरा बुकमार्क मिल गया।
देव

-1


जब आप Crtl+ का उपयोग करते हैं C, तो आप प्रोग्राम को बाधित करते हैं ( इसे " मार ")।
जो आप शायद देख रहे हैं वह आपके कार्यक्रम को स्थगित करना है ( इसे " रोकें ")। इसके लिए, आप Crtl+ का उपयोग कर सकते हैं Z
एक बार जब आपका कार्यक्रम रोक दिया जाता है, तो आप इसका उपयोग करके देख सकते हैं jobs। उदाहरण के लिए:
[1]+ Stopped ./foobar
यहां मेरे पास केवल एक नौकरी है, नौकरी # 1 है, लेकिन एक से अधिक हो सकते हैं - प्रत्येक नौकरी की अपनी संख्या होती है।
उदाहरण के लिए bg, fgऔर कई आदेशों का उपयोग करके आप निलंबित प्रक्रिया को नियंत्रित कर सकते हैं kill
bg %1में # 1 नौकरी पुनः आरंभ करेगा पावती जी दौर
fg %1इच्छा पुनः आरंभ में नौकरी # 1 अयस्कg राउंड
kill %1# 1 जॉब को मार देगा
जिसे आप उपयोग कर सकते हैं bgऔर fgबिना किसी तर्क के साथ यदि आपके पास केवल एक सक्रिय जॉब है।


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