लिनक्स पर शेल फ़ंक्शन कहाँ संग्रहीत हैं?


11

पहले तो मैं इस कारण की तलाश कर रहा था कि whichकुछ प्रोग्राम को एक तर्क के रूप में देने के बाद कुछ भी आउटपुट नहीं करता है, जैसे cd

मैंने यहां जो पाया है , उसका कारण शायद यह है कि cdमेरी मशीन में एक फ़ंक्शन है, जो चलने की पुष्टि करता है type cd

TLDR: लेकिन सामान्य कार्यक्रमों के रूप में जो वैरिएबल whichके लिए धन्यवाद का पता लगा सकते $PATHहैं, उन्हें उन $PATHफ़ोल्डरों में से एक में रखा गया है , जहां फ़ंक्शंस या स्क्रिप्ट जैसे cdसंग्रहित हैं?

user@linuxmchine:~$ type cd
cd is a function
cd () 
{ 
    __zsh_like_cd cd "$@"
}

मुझे मिलता है cd is a shell builtin। अपने खोल (zsh?) के लिए मैन पेज पर एक नजर डालें
Xen2050

1
बाहर की जाँच करें unix.stackexchange.com/questions/85249/… समस्या यह है कि जो एक विरासत कमांड है जिसका उपयोग नहीं किया जाना चाहिए - विशेष रूप से इस प्रश्न जैसी चीजों के कारण।
जो

जवाबों:


12

उपयोगकर्ता परिभाषित कार्य

आमतौर पर बैश फ़ंक्शन स्थायी रूप से एक bashस्टार्ट-अप स्क्रिप्ट में संग्रहीत होते हैं ।

  • सिस्टम-वाइड स्टार्ट-अप स्क्रिप्ट: /etc/profileलॉगिन गोले के लिए, और /etc/bashrcइंटरैक्टिव गोले के लिए।
  • उपयोगकर्ता स्टार्ट-अप स्क्रिप्ट को परिभाषित करता है: ~/.bash_profileलॉगिन गोले के लिए, और ~/.bashrcइंटरैक्टिव गोले के लिए।
  • इंटरैक्टिव manअनुभाग में इंटरैक्टिव / लॉगिन गोले के बारे में अधिक जानकारी बैश पृष्ठ में पाई जा सकती है ।

बश शुरू होने पर उपयोगकर्ता परिभाषित शेल फ़ंक्शन गतिशील रूप से एक हैश (या लुकअप टेबल) में लोड किए जाते हैं। बैश स्रोत फ़ाइल variable.cसे तालिका के लिए परिभाषा है:

/* The list of shell functions that the user has created, or that came from
   the environment. */
HASH_TABLE *shell_functions = (HASH_TABLE *)NULL;

उपयोगकर्ता परिभाषित कार्यों को बैश declareकमांड के साथ सूचीबद्ध किया जा सकता है , अन्य शेल अभी भी उपयोग करते हैं typeset। बैश declareमें typesetकमांड को सुपर किया है ।

declare -f

कार्य बश शेल के जीवनकाल के लिए स्मृति में मौजूद हैं।

शैल परिभाषित (बिलिन) कार्य

ये इस तरह के रूप में आम कार्य हैं echo, printf, cdऔर :। उन्हें एक पुस्तकालय में संकलित किया जाता है जो bashनिष्पादन योग्य में जुड़ा हुआ है । बाहरी परिभाषा को लोड करने की तुलना में निष्पादन योग्य में परिभाषाओं को बनाना समय बचाता है। इन फ़ंक्शंस की परिभाषाएँ ( .defस्रोत फ़ाइलों में सी स्रोत में पार्स की गई) को builtinsबैश स्रोत की निर्देशिका में रखा गया है ।

एक उपयोगी एक तरफ: शेल बिलिन कमांड के उपयोग की जानकारी के लिए help <command>। जैसे

help                # list all builtins
help declare        # info and options for declare
help -m declare     # gives man style information for declare

उस अंश के उत्तर के लिए धन्यवाद। यह वही है जिसकी मुझे तलाश है। क्या आपको लगता है कि प्रक्रिया को बनाने या कुछ ऐसा करने का एक उपकरण है, typesetजो दिखाएगा कि फंक्शन के निर्माण / परिवर्तन के कारण कौन सी फ़ाइल / स्क्रिप्ट दिखाई देगी?
गाब्रिजेल unइमुनोविक

मुझे ऐसे किसी भी उपकरण का पता नहीं है - यह फ़ंक्शन परिभाषा के स्रोत फ़ाइल को प्रदर्शित करने के लिए declareया typesetकमांड के लिए एक उपयोगी विकल्प होगा । मुझे लगता है कि यह एक सॉफ्टवेयर इंजीनियरिंग मुद्दा है। हाल ही में एक .aliasफ़ाइल में परिभाषित शेल फ़ंक्शन मिला - वह नहीं जो मैं उम्मीद कर रहा था!
शक

8

शेल फ़ंक्शंस शेल की मेमोरी में संग्रहीत हैं (या, शायद, अनिर्दिष्ट अस्थायी फ़ाइलों में)। वे किसी भी प्रयोग करने योग्य तरीके से मौजूद नहीं होते हैं जब तक कि शेल शुरू नहीं होता है (जैसे, जब आप एक सीएलआई में प्रवेश करते हैं, या एक शेल विंडो शुरू करते हैं जैसे xterm) और वे परिभाषित होते हैं (जैसे, पढ़ने .bashrcसे .bash_profile, या कुछ इसी तरह) और वे बंद हो जाते हैं शेल समाप्त होने पर मौजूद होता है।


1
प्रॉम्प्ट पर आपके द्वारा लिखी जाने वाली कुछ चीज़ों की अल्पकालिक प्रकृति महत्वपूर्ण है। मेरा वोट इस जवाब पर जाता है। यदि आप cd () { pwd; builtin cd "$@"; }प्रॉम्प्ट पर टाइप करते हैं तो केवल वही जगह संग्रहीत है जो आपके वर्तमान में चल रहे शेल की याद में है। (मेरा उदाहरण बैश है, लेकिन यही सिद्धांत किसी भी शेल पर लागू होता है।)
ट्रिपल डि

6

cdऔर अन्य सामान्य आदेश जैसे echo, typeऔर aliasतथाकथित बिलिन हैं

अंतर्निहित कमांड शेल के भीतर ही समाहित हैं और अलग-अलग शेल के अलग-अलग कमांड में निर्मित हो सकते हैं।


4
मुझे नहीं पता कि क्या यह इस बात पर जोर देने के लायक हो सकता है कि बिलियन कमांड के लिए निष्पादन योग्य कोड cdशेल प्रोग्राम में ही निहित है, उदाहरण के लिए फ़ाइल के भीतर /bin/bashयदि वह आपका शेल है। (मुझे लगता है कि यहां आपका शब्द स्पष्ट है, लेकिन मैंने देखा है कि लोग हर तरह की चीजों से भ्रमित हो जाते हैं।)
डेविड जेड

1

द सुपर यूजर सवाल बैश फंक्शन की परिभाषा का पता लगाना इस एक के साथ निकटता से संबंधित है। उपयोगकर्ता HairOfTheDog ने इस उत्तर को प्रदान किया ( पैराफ्रास्ड ):

निम्नलिखित कमांड किसी फ़ंक्शन की परिभाषा के स्थान (फ़ाइल नाम और लाइन नंबर) की रिपोर्ट करेंगे। नामक एक कार्य को मानते हुए foo,

# Turn on extended shell debugging
shopt -s extdebug

# Display 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

उपरोक्त केवल bashसामान्य रूप से POSIX गोले में ही काम कर सकता है ।

यह खोजने के लिए ब्लू रास्पबेरी के लिए धन्यवाद !

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