2013-01-22 41 views
5

क्या एक बैश स्निपेट को स्रोत करना संभव है, लेकिन अगर वास्तव में कोई निश्चित स्थिति सत्य है तो वास्तव में इसके अंदर से एक फ़ंक्शन प्रदान करें?एक सोर्सड बैश स्निपेट सशर्त रूप से सोर्सिंग खोल में एक फ़ंक्शन कैसे प्रदान कर सकता है?

तो मैं जो पूछ रहा हूं वह यह है कि मैं निर्देशिका से सभी फाइलों को बिना शर्त स्रोत कर सकता हूं, लेकिन सोर्स की गई फाइलों में सोर्सिंग शैल को फ़ंक्शंस प्रदान करने के लिए तर्क शामिल है या नहीं।

उदाहरण:

  • .bashrc सूत्रों पूरे उप फ़ोल्डर .bashrc.d
  • .bashrc.d/xyz एक समारोह adduser2group जहां usermod प्रबंधन नहीं करती है -a -G
  • .bashrc.d/xyz कि समारोह केवल करने के लिए प्रदान करना चाहिए जो पुराने सिस्टम पर काम करता है प्रदान करता है सोर्सिंग खोल यदि यह पुरानी प्रणाली पर चल रहा है।

मेरे वर्तमान विधि सशर्त डेबियन कार्यक्रम (alias adduser=adduser2group) के बाद एक alias नामित adduser तैयार करना है। तो मैं केवल adduser <user> <group> अर्थशास्त्र लागू करता हूं, लेकिन फिर भी यह सहायक है।

क्या कोई ऐसा समाधान है जिसके लिए इस समाधान की आवश्यकता नहीं है? इस विधि के बाद नाम संघर्षों का एक मौका है जिसे मैं टालना पसंद करूंगा।

+0

यदि आप सभी से परिचित पर हैं कैसे 'configure' काम करता है, यह सिर्फ 1-समय गैर विनाशकारी परीक्षण निर्धारित करने के लिए क्या यह पर्यावरण में चल रहा है, और पथ सेट करने के लिए सशर्त तर्क का उपयोग करता , एक सतत स्क्रिप्टिंग प्रयोग प्रदान करने के लिए आवश्यक प्रोग्राम नाम, और पैरा। ऐसा लगता है कि यह आपके लिए भी काम करेगा (और आप वैसे भी वैसे भी हैं)। मेरी तुच्छ राय में। सौभाग्य। – shellter

उत्तर

2

आप कार्यों आप चाहते हैं कि जब भी एक विशेष स्थिति रखती समारोह को परिभाषित कर सकते हैं और,, तो आप सिर्फ सेट नहीं:

$ function alpha() { echo $1; } 
$ alpha 10 
10 

अपनी हालत का मूल्यांकन - और विचार यह सच है:

$ if [[ your condition ]]; then unset alpha; fi 
$ alpha 10 
alpha: command not found 
+2

मेरे द्वारा उपयोग किए जाने वाले आलसी दृष्टिकोण यह है कि फ़ंक्शन को पहली बार इसे फिर से परिभाषित किया जाए। 'अल्फा() {अगर शर्त; फिर अल्फा() {सामान; }; अन्य अल्फा() {:; }; फाई; अल्फा; } ' – kojiro

+0

@kojiro यह उन मामलों में बहुत दिलचस्प है जिन्हें आप जानते हैं कि कॉल किया जाएगा और आप कोई त्रुटि नहीं आना चाहते हैं। अच्छा समाधान! – Rubens

+0

@ रूबेन्स: अच्छा जवाब। सीधा मुद्दे पर। मुझे पता नहीं था कि मैं इस तरह से 'अनसेट' का उपयोग कर सकता हूं। धन्यवाद। +1 और जैसे ही काम करता है मैं स्वीकार करूंगा। – 0xC0000022L

3

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

lib.sh:

if true; then 
    foo() { 
     echo foo 
    } 
else 
    bar() { 
     echo bar 
    } 
fi 

test:

#!/bin/bash 

. ./lib.sh 
foo 
bar 

जब यह चल रहा है, केवल foo परिभाषित किया गया है:

$ bash test 
foo 
test: line 5: bar: command not found 

स्थानापन्न if true अधिक उपयुक्त तर्क के साथ अपने आवेदन के लिए ...

+0

आपके उत्तर के लिए धन्यवाद। यह देखने के लिए अच्छा भी काम करता है। मैं इस धारणा के तहत था कि यह काम नहीं करेगा।+1 – 0xC0000022L

1

एक विकल्प के रूप में, ऐसा लगता है कि return भी नौकरी करता है। तो कहा जा सकता है:

[[ condition ]] || return