कैसे बाश कार्यों में जाल सेटअप करने के लिए?


13

मैं trapबैश स्क्रिप्ट में सेटअप कर सकता हूं लेकिन फ़ंक्शन को बैश नहीं कर सकता ।

उदाहरण के लिए, sourceनीचे दिया गया कोड और चलाएं f, अब प्रयास करें Ctrl+ C, यह फंस नहीं गया है!

कैसे trapबाश कार्यों में सेटअप करने के लिए ?

  4 trap ctrl_c INT
  5 
  6 ctrl_c () {
  7  echo "** Trapped CTRL-C"
  8 }
  9 
 10 
 11 f () {
 12   for i in `seq 1 100`; do
 13     sleep 1
 14     echo -n "."
 15   done
 16 } 

2
आप fअपने कोड के अंत में, और स्थान को हटा सकते हैं f ()
GWF

जवाबों:


7

ऐसा इसलिए है क्योंकि यह SIGINT को प्रक्रिया के बजाय अग्रभूमि में भेजता है bash(जो स्क्रिप्ट चला रहा है)। यदि आप ऐसा करना चाहते हैं, तो फ़ंक्शन को अतुल्यकालिक बनाएं और फिर उपयोग करें wait(जो अपेक्षित रूप से कार्य करेगा और जाल का उपयोग करेगा)।


यह काम करता है। लेकिन मैंने पाया कि अगर fएक पाइप में है echo 123 | f, तो यह फंस नहीं रहा है?
चेंग

@Cheng एक उपखंड का उपयोग करें (और इस मामले में एक पाइप वैसे भी अनावश्यक है, बस एक heredoc / herestring का उपयोग करें)। (command | command) &
क्रिस डाउन

1

प्रोटिप: अग्रभूमि प्रक्रिया को एक क्विट के साथ भेजें Ctrl- \जब Ctrl- C, - Z, - Dकाम नहीं कर रहे हैं।

निष्पादन के अंत में स्पष्ट जाल trap - list of signals here

एक गैर-उत्पादन प्रणाली पर मज़ा: सभी समझदार संकेतों के लिए एक जाल स्थापित करने का प्रयास करें (उदाहरण के लिए, किल नहीं)। kill -l(ऐसा नहीं है कि लोअर-केस L नंबर 1 या पाइप नहीं है।


0

मुझे लगता है कि आपको समारोह को वैश्विक बनाना चाहिए

#!/bin/bash
trap ctrl_c INT
ctrl_c () {
  echo "** Trapped CTRL-C"
} 
for i in `seq 1 100`; do
  sleep 1
  echo -n "."
done

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