2012-02-29 20 views
7

मैं हर जगह खोज कर रहे हैं और मुझे विश्वास है वैश्विक चर की तुलना में है कि अन्य करने के लिए कोई रास्ता नहीं है कि वहाँ आए हैं लेकिन मेरा मानना ​​है कि में stackoverflow.com गुरु मेरी मदद करने में सक्षम हो सकता है:तर्क पारित करके जाल कार्य?

वहाँ है किसी भी तरह से तर्क पारित करके एक समारोह को फंसाने के लिए बाश में?
उदाहरण के लिए, trap <function_name> <arg_1> <arg_2> SIGINT?

उत्तर

13

trap आपको एक मनमाना आदेश (या आदेशों का अनुक्रम) निर्दिष्ट करने देता है, लेकिन आपको उस आदेश को एक तर्क के रूप में पास करना होगा। उदाहरण के लिए, इस: जब भी खोल SIGINT प्राप्त करता

foo bar baz | bip && fred barney ; wilma 

:

trap 'foo bar baz | bip && fred barney ; wilma' SIGINT 

इस चलेंगे। आपके मामले में, यह लग रहा है कि आप की तरह हैं:

trap '<function> <arg_1> <arg_2>' SIGINT 
+1

हाँ! धन्यवाद:] – Kounavi

+0

दरअसल यह जाल "myfunction $ arg_1 $ arg_2" कॉल करने के बाद से काम नहीं करता है सिगिनट सिगरेट का मतलब था कि जब Ctrl-C को $ arg_1 $ arg_2 के पुराने मान दबाए गए थे जहां अपडेट किए गए थे और अपडेट नहीं थे। मान लीजिए कि मैं एक रैपर फ़ंक्शन का उपयोग करूंगा या तर्कों को वैश्विक बनाउंगा क्योंकि मैं उस काम को जिस तरीके से लक्षित नहीं कर सकता:/P.S .: क्या इससे कोई फर्क पड़ता है कि मैंने डबल_क्वाट्स का उपयोग किया था और आपके उदाहरण में एकल नहीं था? – Kounavi

+1

@ कौनावी: जैसा कि आपने अनुमान लगाया है - आपको सिंगल-कोट्स का उपयोग करने की आवश्यकता है, डबल-कोट्स नहीं। – ruakh

2

शायद मैं आप गलत समझ रहा हूँ, लेकिन ... यह कानूनी है:

trap "cp /etc/passwd $HOME/p" SIGINT 
trap 'cp /etc/passwd /tmp/p; echo wooo hoo' SIGINT 
+0

केवल एकल उद्धरण प्रकार $ arg1, $ arg2 इत्यादि के चर के साथ काम करते हैं, लेकिन, हाँ, मुझे यही चाहिए! ;) – Kounavi

+1

मुझे खुशी है कि माइकल ने इसे इतनी अच्छी तरह से समझाया और आपने इसे काम किया। :) – rsaw

1

मुझे यकीन है कि मैं सही ढंग से तुम क्या मतलब समझ में नहीं कर रहा हूँ , लेकिन यदि आप एक सिग्नल हैंडलर बनाना चाहते हैं तो एक फ़ंक्शन कॉल करें और इसे पैरामीटर पास करें, trap "function arg1 arg2" SIGNAL काम करना चाहिए। उदाहरण के लिए trap "ls -lh /" INT आपके खोल में Ctrl + C का कारण बन जाएगा जिसके परिणामस्वरूप ls -lh / (2 तर्क वाले प्रोग्राम) को कॉल किया जा रहा है।

+0

असल में मैं उद्धरणों का उपयोग नहीं कर रहा था और यह काम नहीं कर रहा था। आपकी मदद के लिए धन्यवाद:] – Kounavi

+0

अपडेट: फिर भी यह नहीं है (शीर्ष पोस्ट में मेरी टिप्पणियों की जांच करें) – Kounavi

+2

बस डबल कोट्स को डबल में बदलें और विस्तार को तब तक देरी होगी जब तक जाल कमांड निष्पादित नहीं किया जाता है, उदाहरण के लिए 'जाल' गूंज के साथ " $ पाथ "'INT' पथ में कोई भी परिवर्तन जाल समारोह में दिखाई देगा। –