मैं उपयोगकर्ता द्वारा परिभाषित शेल फ़ंक्शन कहां रख सकता हूं?


14

मैं एक ऐसा फंक्शन बनाने की योजना बना रहा हूं, जो मेरे लिए चीजों को सरल बनाए। समारोह कुछ इस तरह होगा

function lazymode()
{
echo "Hello World!";
}

जब मैं शेलlazymode में कमांड का उपयोग करता हूं , तो यह आउटपुट करेगा ।Hello World!

मुझे उपयोगकर्ता द्वारा परिभाषित फ़ंक्शन को किस फ़ाइल में रखना चाहिए?

जवाबों:


14

फ़ंक्शन पर निर्भर करता है। यदि यह सिर्फ एक सुपर-सरल वन-लाइनर है जैसे कि आप एक उपनाम बना सकते हैं या फ़ंक्शन को चिपका सकते हैं ~/.bashrc(एक फ़ाइल जो शुरू होने पर लोड को बैश करती है)।

यदि आप कुछ अधिक भावपूर्ण बना रहे हैं, तो यह अपनी निष्पादन योग्य स्क्रिप्ट बनाने के लिए अधिक समझदार हो सकता है ~/bin/जिसमें डिफ़ॉल्ट रूप से मौजूद नहीं होगा (यह सिर्फ एक निर्देशिका है) लेकिन आपके रास्ते में होना चाहिए। इसके लिए याद रखें कि फ़ाइल को निष्पादन योग्य होना चाहिए ( chmod +x filename) और एक उचित #!/bin/bashश्लोक के साथ शुरू करना चाहिए ।

दूसरे मार्ग के कुछ स्पष्ट लाभ हैं:

  • यह देखना आसान है कि क्या उपलब्ध है
  • एक सिंटैक्स त्रुटि आपके प्रोफ़ाइल को टेंक नहीं करेगी
  • यदि आप स्क्रिप्ट को बदलते हैं तो आपको अपने bash कॉन्फिगरेशन को री-सोर्स करने की आवश्यकता नहीं है
  • यह किसी भी शेल के लिए उपलब्ध है जब तक कि पूर्ण पथ का उपयोग किया जाता है या ~/bin/उस शेल के लिए भी पथ में है (जो कि ज्यादातर मामलों में होना चाहिए)।

मैंने बाद के विकल्प का उपयोग किया। मेरे फ़ंक्शन में कमांड्स हैं जो फ़ाइलों को हटाते हैं, कुछ को भूल जाते हैं, कमांड्स को javac और java निष्पादित करते हैं। और जब मैंने इसे गनोम-टर्मिनल पर आज़माया, तो यह ठीक काम नहीं कर रहा है। क्या आपको लगता है कि कोई मुद्दा है?
हाबिल मेलक्विड्स कैलेजो

इसके बजाय क्या करता है?
ओली

यह पहले से तय है। इस उत्तर के माध्यम से तय किया गया
एबेल मेलक्वेड्स कैलेजो

उम ... क्या उपयोगकर्ता स्क्रिप्ट के /usr/local/binसाथ खिलवाड़ नहीं करना चाहिए $PATH?
Braiam

यह मुझे लगता है कि कार्यों में ~/.bashrc(जैसा कि यह sourceघ है) कार्यों को लगाने का एक छोटा-सा लेकिन ध्यान देने योग्य लाभ यह है कि बैश PATH लुकअप करने से पहले कार्यों की तलाश करता है।
ज़न्ना

4

सबसे अच्छा विकल्प ~/.bashrcफ़ाइल होगा ।

आप या तो अपनी शेल फ़ंक्शन परिभाषाओं को सीधे अपनी ~/.bashrcफ़ाइल में लिख सकते हैं , या, यदि आपके पास उनमें से बहुत सारे हैं और अपनी ~/.bashrcफ़ाइल को अव्यवस्थित नहीं करना चाहते हैं , तो आप उन सभी को अपने चयन की किसी अन्य फ़ाइल में रख सकते हैं - बस यह सुनिश्चित करें कि अपनी फ़ाइल में दर्ज करें ~/.bashrc। उदाहरण के लिए, यदि आपके फ़ंक्शन के साथ फ़ाइल का नाम है bash_functions, तो बस अपनी ~/.bashrcफ़ाइल में लाइनें जोड़ें :

if [[ -f /path/to/bash_functions ]]; then
    source /path/to/bash_functions
fi

या, समतुल्य:

if [[ -f /path/to/bash_functions ]]; then
    . /path/to/bash_functions
fi

जहां .सिर्फ एक प्रतीकात्मक प्रतिनिधित्व है sourceifपरीक्षण करता है सुनिश्चित करें कि फ़ाइल /path/to/bash_functionsयह स्रोत करने के लिए प्रयास करने से पहले से मौजूद है।

इस तकनीक बहुत में उपनाम स्थापित करने के समान है ~/.bashrcएक फ़ाइल कहा जाता है बनाने के द्वारा ~/.bash_aliasesऔर इसी तरह के वाक्य रचना में ऊपर है कि करने के लिए का उपयोग कर ~/.bashrcअपने अस्तित्व के लिए परीक्षण करने के लिए और फिर इसे स्रोत।


धन्यवाद, यह काम किया। वैसे, इसके अंतर के साथ क्या है। कुछ linux में, मैं bashrc में कार्य नहीं कर सकता
Abel Melquiades Callejo

2
~/.profileफ़ाइल लॉगिन शेल के लिए कमांड दुभाषिया द्वारा निष्पादित की जाती है। जब आप GUI का उपयोग करते हैं और आप टर्मिनल खोलते हैं, तो उस फ़ाइल को निष्पादित नहीं किया जाता है क्योंकि आप एक लॉगिन शेल में नहीं होंगे।
रादु राईडेनू

1

स्थायी कार्य घोषित करने के लिए यहां एक आवश्यक प्रक्रिया है:

  1. ~/.bashrcएक पाठ संपादक में फ़ाइल खोलें । कोई फर्क नहीं पड़ता कि कौन सा पाठ संपादक है, इसलिए जब तक आप जानते हैं कि इसका उपयोग कैसे करना है और जब तक आप इसे खोलते हैं/home/<username>/.bashrc

  2. ~/.bashrcउदाहरण के लिए, अपने स्वयं के कार्य की घोषणा के अंत में :

    find_dirs(){
        find "$1" -type d
    }
  3. फ़ाइल को सहेजें और बंद करें।

~/.bashrcफ़ाइल आप इंटरैक्टिव खोल (नए टर्मिनल टैब, लॉगिन के माध्यम से है कि खोलने हर बार पढ़ा है ssh, या खुली TTY1 या अन्य आभासी कंसोल)। यह स्क्रिप्ट फ़ाइलों में उपलब्ध नहीं होगा, क्योंकि ~/.bashrcगैर-इंटरैक्टिव शेल के लिए नहीं पढ़ा जाता है। यदि आप विकल्प के bashसाथ चलते हैं तो यह उपलब्ध नहीं है --norc

यदि आप चाहते हैं कि फ़ंक्शन वर्तमान में खुले टैब में तुरंत उपलब्ध हो, तो source ~/.bashrcकमांड का उपयोग करें ।


फ़ंक्शंस नियमित आदेशों की तरह ही तर्क लेते हैं। उदाहरण के लिए, जब आप किसी फ़ंक्शन को कॉल करते हैं, तो स्थिति संबंधी मापदंडों $1को $9इंगित करें। ऊपर के उदाहरण में find_dirsकेवल एक स्थितीय पैरामीटर लिया जाता है, और इसे कहा जाएगा find_dirs /etc। आप $@सभी स्थितीय मापदंडों को संदर्भित करने के लिए भी उपयोग कर सकते हैं । कार्य भी पुनर्निर्देशन स्वीकार करते हैं। आप किसी फ़ंक्शन को कॉल कर सकते हैं find_dirs $1 > /dev/null; हम इसे इस प्रकार भी घोषित कर सकते हैं:

find_dirs(){
    find "$1" -type d
}

ध्यान दें man bash: "कार्य मौजूदा शेल के संदर्भ में निष्पादित किए जाते हैं; उनकी व्याख्या के लिए कोई नई प्रक्रिया नहीं बनाई जाती है"। इसका मतलब है कि आपको अपने शेल निष्पादन परिवेश - परिवर्तन चर और टर्मिनल सेटिंग्स को बदलने की क्षमता वाले कार्यों से भी अवगत होना चाहिए।

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