मैं अपने शेल में परिभाषित कार्यों को कैसे सूचीबद्ध करूं?


223

मैं सभी उपनामों की सूची दिखाने के लिए उपनाम टाइप कर सकता हूं।

लेकिन कार्यों के लिए, मैं जो कुछ भी कर सकता हूं वह मेरा है .bash_profile

यह केवल उस फ़ाइल में प्राप्त करता है, न कि सहायक फ़ाइलों में या गतिशील रूप से परिभाषित।

क्या यह पता लगाने के लिए अधिक सुविधाजनक तरीका है कि वर्तमान में कौन से फ़ंक्शन परिभाषित हैं?



2
@AlastairIrvine डुप्लिकेट नामांकन के लिए धन्यवाद; हालाँकि, मैंने इसे दूसरे तरीके से हल किया। इस प्रश्न में काफी अधिक विचार और उत्थान हैं, साथ ही साथ उत्तर का व्यापक चयन भी; और आपके नामांकित डुप्लिकेट पर स्वीकृत उत्तर स्पष्ट रूप से अस्पष्ट और यकीनन गलत है।
ट्रिपल ओक्ट

जवाबों:


273

declare -F

फ़ंक्शन के नाम और परिभाषा को बेसिन कमांड के -fविकल्प के साथ सूचीबद्ध किया जा सकता है declare(बैश बिल्डिंस देखें)। फ़ंक्शन नामों को सूचीबद्ध -Fकरने का विकल्प declareकेवल (और वैकल्पिक रूप से स्रोत फ़ाइल और लाइन नंबर)।

बैश संदर्भ मैनुअल


1
GNU बैश में 4.3.46 (1) -release (x86_64-pc-linux-gnu) -F सूचियों / -f सूचियों पूरे कार्य
ceph3us

5
"वैकल्पिक" स्रोत फ़ाइल / लाइन # प्राप्त करने के लिए, ऐसा प्रतीत होता है कि आपको extdebug ( shopt -s extdebug) को सक्षम करना होगा और declare -Fकमांड में एक या अधिक फ़ंक्शन नाम की आपूर्ति करनी होगी । IOW, extdebug सक्षम होने पर भी फाइलनेम / लाइन # s की आपूर्ति नहींdeclare -F करता है, जो प्रलेखन से स्पष्ट नहीं है, और न ही यह विशेष रूप से सहज, IMO है।
रॉन बुर्क

बेहतर समाधान के लिए नीचे @ user495470 का उत्तर देखें।
११:०४ पर स्टारबिम्रेनबोलाब्स

82

मानो बैश शेल:

typeset -f

कार्यों को सूचीबद्ध करेगा।

typeset -F

केवल फ़ंक्शन नामों को सूचीबद्ध करेगा।


8
मेरा बैश v4.1.17 (9) -release कहता है:Obsolete. See `help declare'.
केविनरपे

5
यह जानना अभी भी अच्छा है कि यह एक पर्याय है।
bmacnaughton


51

declare -F वास्तव में प्रिंट कमांड की घोषणा करते हैं और न केवल फ़ंक्शन नाम:

$ declare -F
declare -f function1
declare -f function2

आप compgen -A functionकेवल फ़ंक्शन नाम प्रिंट करने के लिए उपयोग कर सकते हैं :

$ compgen -A function
function1
function2

6
compgen -A functionबस वही था जिसकी मुझे तलाश थी।

2
अच्छा! मैं अपने मामले में भी उपनाम चाहता था ... आप उपनाम और कार्य दोनों प्राप्त कर सकते हैंcompgen -a -A function
मैट बर्न

+1 और मैंने अपने निजी कार्यों को केवल लिनक्स लिनक्स पर करने के लिए निम्नलिखित प्रयोग किया है:compgen -A function | grep "^[a-z]\+" | grep -vE "^dequote|^quote|^in_array"
Dmytro Dzyubak

30

टाइपसेट अप्रचलित है, कृपया उपयोग करें:

declare -f

या

declare -f function_name

या

type function_name

4
set | grep " ()"

के स्थान में ग्रेप आप भी उपयोग कर सकते हैं fgrep या hgrep (hgrep मेरी निजी पसंदीदा, यह ग्रेप है लेकिन यह उच्च लाइट्स 'ग्रेप-ped' परिणाम।

hgrep यहां पाया जा सकता है: ACME लैब्स hrerep


1
यह फ़ंक्शन को सूचीबद्ध करेगा, लेकिन ऐसे चर भी हैं जिनके मूल्य में `()` है
Alois Mahdal

2
@ ऐलोइसमहलड एक है जो काम करता है set | grep " () $" | cut -d' ' -f1:। लेकिन यह अन्य उत्तरों की तुलना में अत्यधिक जटिल है।
वेजेंड्रिया

5
grepइसके लिए एक अच्छा समाधान नहीं है, जो फ़ंक्शन फ़ंक्शन परिभाषाओं से मेल खाते हैं, झूठी सकारात्मकता का कारण बनेंगे। @wjandrea को अभी भी मल्टी लाइन स्ट्रिंग्स द्वारा पकड़ा जा सकता है, जैसा कि कोई भी रेगेक्स होगा।
मैट अप

1

मैं इसका कोई विशेषज्ञ नहीं हूं, फिर भी सीख रहा हूं, लेकिन इस प्रश्न और इसके उत्तर को खोजने के बाद क्योंकि मैं भी यही चाहता था, मैंने निम्नलिखित लिखा (" आर्केटिपल पॉल की घोषणा " उत्तर के आधार पर ) आखिरकार मैं क्या था: दोनों उपनामों और कार्यों की एक प्रारूपित सूची:

function functionaliaslist() {
    echo
    echo -e "\033[1;4;32m""Functions:""\033[0;34m"
    declare -F | awk {'print $3'}
    echo
    echo -e "\033[1;4;32m""Aliases:""\033[0;34m"
    alias | awk {'print $2'} | awk -F= {'print $1'}
    echo
    echo -e "\033[0m"
}

इससे पहले कि मैं Lri के उत्तर को देखता , और इसलिए उससे अलग होता, मैं प्राप्त करने के लिए उचित आदेशों के साथ declareऔर aliasलाइनों को प्रतिस्थापित करता हूं compgen:

function functionaliaslist() {
    echo
    echo -e "\033[1;4;32m""Functions:""\033[0;34m"
    compgen -A function
    echo
    echo -e "\033[1;4;32m""Aliases:""\033[0;34m"
    compgen -A alias
    echo
    echo -e "\033[0m"
}

मैं जो चाहता था, उसके लिए एक इलाज करता है। मामले में साझा करना किसी और की मदद करता है।

compgen -A [action](और compgenपाठ्यक्रम के लिए अन्य विकल्प ) के लिए उपलब्ध अन्य "कार्यों" की एक भीड़ है । मुझे यहाँ एक अच्छा लेखन मिला जिसमें मैन पेज का लिंक भी शामिल है (क्योंकि man compgenकुछ मामलों में काम नहीं करता है)।

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