क्या बैश एक फ़ंक्शन की परिभाषा दिखा सकता है?


262

क्या बैश में बैश फ़ंक्शन की परिभाषा देखने का एक तरीका है?

उदाहरण के लिए, मान लें कि मैंने फ़ंक्शन को परिभाषित किया है foobar

function foobar {
    echo "I'm foobar"
}

क्या बाद में foobarचलने वाले कोड को प्राप्त करने का कोई तरीका है ?

$ # non-working pseudocode
$ echo $foobar
echo "I'm foobar"

जवाबों:


357

का उपयोग करें type। यदि foobarउदाहरण के लिए आपके में परिभाषित किया गया है ~/.profile:

$ type foobar
foobar is a function
foobar {
    echo "I'm foobar"
}

यह पता लगाता है कि क्या foobarथा, और अगर इसे एक फ़ंक्शन के रूप में परिभाषित किया गया था, तो इसे declare -fpmohandras द्वारा समझाया गया है।

केवल फ़ंक्शन का शरीर (अर्थात कोड) का उपयोग करने के लिए sed:

type foobar | sed '1,3d;$d'

2
@sjsupersumit प्रश्न स्पष्ट रूप से एक बश समाधान के लिए पूछता है।
bfontaine

210

आप डिक्लेयर का उपयोग करके बश में एक फ़ंक्शन की परिभाषा प्रदर्शित कर सकते हैं। उदाहरण के लिए:

declare -f foobar

1
महान, इस बिंदु पर, तब भी काम करता है जब अन्य भरी हुई स्क्रिप्ट फ़ाइलों में परिभाषित कार्य करता है। Zsh में भी काम करता है।
डिएगो नेमो

2
यदि आप उपयोग करते हैं तो गैर-लाइनक्स सिस्टम पर पुराने गोले के साथ काम करता हैtypeset -f
इमैनुअल

यह भी अच्छा है कि यह सिर्फ functionपरिभाषा को दर्शाता है , इसलिए यदि आप चाहते हैं तो आपको पार्स करने की आवश्यकता नहीं है।
रिबमार

5
set | sed -n '/^foobar ()/,/^}/p'

यह मूल रूप से आपके सेट कमांड से लाइनों को फंक्शन नाम फोब्बर () से शुरू करता है और उसके साथ समाप्त होता है)


4
set | grep -A999 '^foobar ()' | grep -m1 -B999 '^}'

फोबार के साथ फंक्शन का नाम है।


4
समस्या: केवल पहले "}" तक ही प्रदर्शित होगी, जो कि जब भी डिफिनेशन में "{...}" के घोंसले हों, तो वह सब कुछ नहीं है, जो वास्तव में बैश अनुमति देता है।
डेस्टिनी आर्किटेक्ट

1
यह भी विफल हो सकता है यदि फ़ंक्शन में यहाँ एक doc / here-string है जिसमें घुंघराले-ब्रेस पैटर्न हैं
Cheetah
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.