एक बैश फ़ंक्शन की परिभाषा ढूँढना


41

मैं एक ऐसे वातावरण में काम करता हूं, जिसमें बहुत सारी विरासत खोल स्क्रिप्ट जादू है। कमांड लाइन से भारी उपयोग की जाने वाली एक चीज़ है bash फ़ंक्शंस जो किसी फ़ाइल से शामिल की गई कुछ फ़ाइल से प्राप्त होती है, जिसमें कुछ फ़ाइल से शामिल है, जो मेरे .bash_profile में शामिल हैं। क्या इन कार्यों की परिभाषा की परिभाषा या उससे बेहतर स्थान पाने का कोई तरीका है, जिसमें उन्हें शामिल किए बिना 5 स्तरों के माध्यम से नीचे ट्रैक करना है?

जवाबों:


39

फ़ंक्शन की परिभाषा प्राप्त करने के लिए:

type -a function_name

@ सोनिकोक्लास्ट: हाँ।
अगली सूचना तक रोक दिया गया।

यदि आप कभी ग्रैंड रैपिड्स में होते हैं, तो मैं आपको एक व्यक्ति में खरीद लूंगा ... अन्यथा हम कोई और रास्ता खोज सकते हैं ...
iconoclast

whence -f function_nameमेंzsh
dezza

66

मान लें कि आपके पास फ़ंक्शन का नाम foo है, तो नीचे दिए गए कमांड्स को फ़ंक्शन की परिभाषा का स्थान मिलेगा, अर्थात यह उस फ़ाइल का नाम होगा जिसमें फ़ंक्शन को परिभाषित किया गया है और उस फ़ाइल के भीतर फ़ंक्शन को परिभाषित करने वाली पंक्ति संख्या ।

# Turn on extended shell debugging
shopt -s extdebug

# Dump the function's name, line number and fully qualified source file  
declare -F foo

# Turn off extended shell debugging
shopt -u extdebug

मेरे मामले में इन कमांड का आउटपुट है:

foo 32 /source/private/main/developer/cue.pub.sh

3
उत्तम। मैंने अभी अपनी bashrc फाइल में bash फंक्शन में इसे बनाया है। whereisfunc() {shopt -s extdebug;declare -F $1;shopt -u extdebug}
नील

5
@ नील: यह आसान है, धन्यवाद: मुझे shoptमौजूदा शेल की स्थिति को बदलने के बिना प्रभाव को स्थानीय करने के लिए एक उपधारा का उपयोग करने का सुझाव whichfunc () ( shopt -s extdebug; declare -F "$1"; )दें : (नोट (...)इसके बजाय का उपयोग करें {...})।
mklement0

वे कमांड एक स्क्रिप्ट से काम क्यों नहीं करते हैं? फ़ंक्शन सही ढंग से काम करता है
एल्बफ़ैन

1
यह स्वीकृत उत्तर होना चाहिए।
भंग

11

फ़ंक्शन की परिभाषा देखने के लिए (जैसा कि यह कहां से आया था), उपयोग करें:

declare -f <functionname>

मुझे लगता है कि यह एक से बेहतर है type -aक्योंकि यह नाराज लोकल पर निर्भर नहीं करता है पहली पंक्ति ~~
yuyichao

1
लेकिन चूँकि वहाँ कोई स्थान नहीं दिया गया है इसलिए यह एक अनकहे प्रश्न का उत्तर है
iconoclast

6

bash -xयह शुरू होने के साथ ही जो चल रहा है उसे डंप कर देगा, जिससे आपको इसे आसानी से ट्रेस करना चाहिए। नव-खोल खोल से बाहर निकलने के लिए मत भूलना।


आसान सामान; किसी फ़ाइल में ट्रेस कैप्चर करने के लिए, script out.txt bash -x(फिर से, मत भूलना exit) का उपयोग करें।
mklement0

-2

एक और तरीका है, कि मैं हाल ही में भी सरल लगता है:

  which <functionname>

(यह भी दिखाएगा कि यह एक उपनाम या एक स्क्रिप्ट है, लेकिन एक उपनाम के स्रोत को ट्रैक नहीं करेगा)


2
मुझे नहीं लगता कि whichबीएसडी या मैक पर उपनामों के बारे में जानकारी दी गई है। साथ ही, यह प्रश्न फ़ंक्शंस के बारे में है, और whichफ़ंक्शंस के बारे में जानकारी नहीं देता है।
dbn

उस नोट के लिए धन्यवाद। मैं अब देख रहा हूं कि "जो" केवल zsh में कार्यों को हल करता है, बैश नहीं।
जोशुआ गोल्डबर्ग

2
मुझे लगता है कि इस उत्तर को डाउनवोट्स को आमंत्रित करने की संभावना है ... यह सवाल का पता नहीं लगता है, क्योंकि स्थान पर कोई जानकारी नहीं है।
आइकनोकॉस्ट

मैंने इसे उपयोग करने के लिए घोषणा को ट्रैक करने के उद्देश्य से उपयोगी पाया है और यह पता लगाया है कि क्या यह एक उपनाम या कार्य है, और उस वाक्यविन्यास को जानने के लिए जिसके साथ यह घोषित किया गया था। हालांकि यह सच है कि केवल @ HairOfTheDog का जवाब सीधे फाइल देता है।
जोशुआ गोल्डबर्ग
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.