Bash स्क्रिप्ट में Ctrl-C


22

मैं बैश लिपियों में ctrl+ को कैसे लागू करूं cताकि स्क्रिप्ट बाधित हो, साथ ही स्क्रिप्ट द्वारा वर्तमान में चल रहे कमांड को भी चलाया जाए?

(कल्पना करें कि एक स्क्रिप्ट है जो कुछ लंबे समय से चलने वाली कमांड को निष्पादित करती है। उपयोगकर्ता ctrl+ को हिट करता है cऔर कमांड को बाधित करता है, लेकिन स्क्रिप्ट आगे बढ़ती है।) मुझे इसे इस तरह से व्यवहार करने की आवश्यकता है कि वे दोनों मारे गए हैं।


1
यदि आपके ओएस में नौकरी-नियंत्रण सक्षम है, तो एक और विकल्प उस स्क्रिप्ट को बंद करना होगा (आमतौर पर crtl-z के साथ)। आप उस नौकरी को पृष्ठभूमि में जारी रख सकते हैं bg, उसे मार सकते हैं या उसके साथ अग्रभूमि में जारी रख सकते हैं fg। बैश मैनपेज अनुभाग देखें JOB CONTROL।
— ott--

जवाबों:


25

आप ऐसा सबरूटीन बनाकर करते हैं जिसे आप SIGINT प्राप्त होने पर कॉल करना चाहते हैं, और आपको चलाने की आवश्यकता है trap 'subroutinename' INT।

उदाहरण:

#!/bin/bash

int_handler()
{
    echo "Interrupted."
    # Kill the parent process of the script.
    kill $PPID
    exit 1
}
trap 'int_handler' INT

while true; do
    sleep 1
    echo "I'm still alive!"
done

# We never reach this part.
exit 0

2
ध्यान दें कि आप उन EXITमामलों में भी फंस सकते हैं, जहां आपके पास कुछ भी है जिसे आप कभी भी निष्पादित करना चाहते हैं, चाहे वह कैसे भी रुके, स्क्रिप्ट बाहर निकलती है। ( KILLछोड़कर, निश्चित रूप से।)
— ब्लरफ्ल

बहुत धन्यवाद! हालांकि, जब 'नींद' मार दी जाती है - शेल अभी भी अगले कमांड को निष्पादित करने में सक्षम हो सकता है जबकि ट्रैप रूटीन चल रहा है: इस मामले में 'इको' ... या मैं गलत हूं?
— 22

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