2013-05-27 14 views
10

का संदर्भ रखें क्या एक शेल फ़ंक्शन को ओवरराइड करना और मूल संदर्भ को संदर्भित करना संभव है?एक खोल फ़ंक्शन को ओवरराइड करें, मूल

f() { echo original; } 
f() { echo wrapper; ...; } 
f 

इस के उत्पादन में किया जाना चाहिए:

wrapper 
original 

इस एक अर्द्ध पोर्टेबल तरह से संभव है?

तर्क: मैं अपने कार्यक्रमों को खोल कार्यों के साथ प्रतिस्थापित करके परीक्षण कर रहा हूं जो लॉग फ़ाइल में अपनी कॉल रिकॉर्ड करते हैं। यह तब तक ठीक काम करता है जब तक मैं केवल कमांड और बिल्टिन लपेटता हूं, और जब तक मुझे अंधाधुंध लॉगिंग नहीं लगता है। अब मैं केवल टेस्ट सूट को प्रत्येक टेस्ट में दिलचस्प टुकड़ा रिकॉर्ड करके अधिक रखरखाव करना चाहता हूं।

तो चलो कहते हैं कि मेरा कार्यक्रम

f 
g 
h 

जहां f, g, h सब खोल कार्य हैं के होते हैं, और मैं सिर्फ g के निष्पादन ट्रेस करने के लिए करना चाहते हैं।

+0

तुमने क्या किया जा सकता है, लेकिन बहुत portably नहीं चाहते हैं। –

उत्तर

3

f() की सामग्री को डंप करने के लिए typeset -f f पर कई गोले (zsh, ksh, bash कम से कम) समर्थन करते हैं। वर्तमान परिभाषा को फ़ाइल में सहेजने के लिए इसका उपयोग करें; फिर, f() को अपनी इच्छानुसार परिभाषित करें। typeset के साथ बनाई गई फ़ाइल को सोर्स करके f() को पुनर्स्थापित करें।

आप थोड़ा (पहली पंक्ति पर _f() को f() का नाम बदलने, थोड़ा जटिल काम जब च() पुनरावर्ती है या अन्य कार्यों आप एक ही तरह से frobbed कॉल) फेंक दिया समारोह संशोधित करते हैं, आप की संभावना इस निर्माण करने के लिए प्राप्त कर सकते हैं आउटपुट आप वांछित।

+0

एक और ऐसा आदेश: 'declare -f f' सुनिश्चित नहीं है कि कौन सा पोर्टेबल है ... – anishsane

+0

न तो 'टाइपसेट' और न ही 'घोषणा' POSIX (समस्या 8, 2013) हैं। – Jens

+0

@ जेन्स: आपका मतलब समस्या 7 टीसी 1 (2013 संस्करण) है। समस्या 8 अभी तक जारी नहीं किया गया है। Eval के साथ विचार के लिए –

4

जेन्स द्वारा उत्तर सही है। पूर्णता के लिए बस नीचे कोड जोड़ना।

आप बस इसे नीचे के रूप में उपयोग कर सकते हैं:

eval "`declare -f f | sed '1s/.*/_&/'`" #backup old f to _f 

f(){ 
    echo wrapper 
    _f # pass "[email protected]" to it if required. 
} 

मैं यहाँ एक ही तर्क का इस्तेमाल किया था: https://stackoverflow.com/a/15758880/793796

+0

+1। – Jens

+1

+1। मैंने इस तकनीक का भी उपयोग किया [यहां] (http://askubuntu.com/questions/73262/how-do-i-teach-bash-in-ubuntu-some-curse-words/73282#73282) –

+0

@glennjackman: I alias_function के विचार पसंद आया :) – anishsane

संबंधित मुद्दे