शेल में एक फ़ंक्शन निर्यात करना


87

कृपया मुझे बताएं कि पैरेंट शेल (बैश, श या क्श) में एक फंक्शन को कैसे एक्सपोर्ट किया जाए ताकि फंक्शन पैरेंट प्रोसेस से प्राप्त होने वाली सभी चाइल्ड प्रोसेस को उपलब्ध हो जाए?


जवाबों:


105

यह export -fसुविधा बैश के लिए विशिष्ट है:

माता-पिता

#!/bin/bash
plus1 () { echo $(($1 + 1)); }
echo $(plus1 8)
export -f plus1
./child 14 21

बच्चा

#!/bin/bash
echo $(plus1 $(($1 * $2)) )

2
निर्यात समारोह केवल चाइल्ड कॉल के लिए उपलब्ध है? इसे वर्तमान बैश सत्र में कैसे लागू किया जाए?
tobashrc

3
@vp_arth: यदि आपको चाइल्ड कॉल में फ़ंक्शन की आवश्यकता नहीं है, तो आपको इसे निर्यात करने की आवश्यकता नहीं है। यह वर्तमान सत्र में किसी भी तरह से उपलब्ध है (ध्यान दें कि यदि यह किसी फ़ाइल में परिभाषित है, तो आपको इसे चालू सत्र में उपलब्ध कराने के लिए इसे चलाने के बजाय फ़ाइल को स्रोत करने की आवश्यकता होगी)।
अगली सूचना तक रोक दिया गया।


3

यदि आप ksh या zsh का उपयोग कर रहे हैं:

आप पर्यावरण चर का उपयोग कर सकते हैं FPATH, जिसमें आप अपने सभी कार्य कर सकते हैं।

यदि FPATHएक इंटरएक्टिव इंटरप्रेटर पर सेट किया गया है, और एक कमांड या फ़ंक्शन वर्तमान शेल वातावरण या में नहीं मिला हैPATH , तो वहां सूचीबद्ध निर्देशिकाओं को लापता कमांड के नाम वाली फ़ाइल के अस्तित्व के लिए खोजा जाता है। यदि कोई पाया जाता है, तो यह वर्तमान शेल वातावरण में उपलब्ध होता है, और फ़ंक्शन को परिभाषित करने की अपेक्षा करता है।

तो, आप अपने सभी कार्यों को एक स्थान पर रख सकते हैं FPATHऔर बाल स्क्रिप्ट भी इसे खोजने में सक्षम होगी।

आप autoloadआवश्यक कार्यों को लोड करने के लिए शेल स्क्रिप्ट में कमांड का उपयोग कर सकते हैं :

autoload fun_a fun_b

Zsh में, काम autoloadकरने के लिए आवश्यक है FPATH में kshऔर इसके करीबी रिश्तेदारों का मानना ​​है कि यह केवल FPATHआपके PATH में नियमित कमांड को ओवरराइड करने के लिए परिभाषित कार्यों का कारण बनता है , क्योंकि वे सीधे परिभाषित होंगे।

पर कुछ विवरण FPATHऔर autoload:


1

यदि आप सबस्क्रिप्शन बनाते हैं, ( )तो वे सभी परिभाषाओं, मापदंडों और शेल चर का एक स्नैपशॉट इनहेरिट करेंगे।

यदि आप उन्हें कार्यक्रमों की तरह क्रियान्वित करते हैं तो आप परिभाषाएँ रख सकते हैं .bashrc

यदि आप एक मौजूदा स्क्रिप्ट को एक रैपर को निष्पादित करने या एक PATH कमांड के लिए प्रतिस्थापन करने की कोशिश कर रहे हैं, तो .bashrcनिष्पादन के विवरण के आधार पर काम करेगा। यदि नहीं, तो आप इसके बजाय एक रैपर स्क्रिप्ट निष्पादित कर सकते हैं जो बस एक .या करता हैsource एक फ़ाइल है कि परिभाषित करता है कार्य करता है और उसके बाद आदेशों के साथ खोल स्क्रिप्ट के साथ एक ही बात प्रतिस्थापित किया जा करने के लिए करता है शामिल की।

आवरण स्क्रिप्ट कुछ इस तरह दिख सकती है:

script=$1
shift
. include.sh
. $script "$@"

विचार यह है कि पहला पैरामीटर वास्तविक स्क्रिप्ट का नाम है और शेष पैरामीटर args हैं, फिर इसके बजाय उपरोक्त स्क्रिप्ट को चलाया जाता है।


2
क्या आप कृपया उन्हें कुछ कोडिंग उदाहरण के साथ समझा सकते हैं। मैं अपना कार्यभार .bashrc
सचिन चौरसिया

1
declare -x -f NAME

और जानकारी

फ़ंक्शन और प्रदर्शन नाम और परिभाषाओं को प्रतिबंधित करें
-x NAME निर्यात करने के लिए

6
कृपया ध्यान दें कि यह विशिष्ट हैbash । ( kshसमकक्षों के लिए declare, typesetएक -xविकल्प है, लेकिन यह केवल चर पर लागू होता है , कार्यों के लिए नहीं; डिट्टो के लिए zsh)।
mklement0

0

कार्य प्रकृति द्वारा निर्यात करने योग्य नहीं हैं। हालाँकि, आप स्ट्रिंग्स को निर्यात कर सकते हैं, इसलिए मेरे पास यहाँ एक छोटी सी चाल है:

func="$(typeset -f funcname)"
export func

फ़ंक्शन आयात करने के लिए, इसे निर्यात किए गए स्ट्रिंग से फिर से परिभाषित करें:

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