2012-12-31 13 views
7

विफल रहता है, मैंने इस प्रकार उदाहरण में एक सरणी को एक पर्यावरण चर के रूप में सेट किया है। स्क्रिप्ट test.shबैश: किसी भी खोल स्क्रिप्ट से इसे सरणी एनवी वैरिएबल और डी-रेफरेंसिंग सेट करने में

test.sh

#!/bin/bash 
export STRING=("str1" "str2") 

स्रोत में

test.sh

अब लिपि में

test-1.sh

#!/bin/bash 
echo ${STRING[0]} 

प्रतिक्रिया जबकि कुछ भी नहीं, बस एक रिक्त पंक्ति, है, अगर मैं test.sh में STRING="str1" सेट करने का प्रयास करता हूं औरमें echo $STRING करता हूं, यह काम करता है।

परीक्षण रूट उपयोगकर्ता से केवल निष्पादित किए जाते हैं, अब एवी परिवर्तक के रूप में सरणी कैसे सेट करें, ताकि मैं आवश्यकता के अनुसार सरणी के तत्वों को कॉल कर सकूं? इससे पहले, मैंने /etc/bashrc को भी संशोधित करने का प्रयास किया है और इसके परिणामस्वरूप कुछ भी सकारात्मक नहीं हुआ है।

मुझे सरणी को env चर के रूप में सेट करने की आवश्यकता है क्योंकि मुझे कई स्क्रिप्ट्स लिखनी होंगी जो इन चर सेटिंग्स को उपयोग करेंगी।

क्या कोई मुझे मुझे सही करने के लिए सुझाव प्रदान कर सकता है जहां मैं गलत कर रहा हूं?

उत्तर

10

ठीक मैनुअल, "बग" अनुभाग पढ़ें।

ऐरे चर (अभी तक) निर्यात नहीं किया जा सकता है।

हालांकि, मुझे नहीं पता कि कई लोग इसे वास्तविक बग मानते हैं। केश-स्टाइल सरणी का समर्थन करने वाले अन्य गोले उन्हें निर्यात करने की अनुमति नहीं देते हैं।

आप पैरामीटर या चर या पर्यावरण के माध्यम से आसानी से सरणी परिभाषाओं को पार कर सकते हैं। हालांकि यह आमतौर पर बहुत उपयोगी नहीं है।

function f { 
    unset -v "$2" 
    typeset "$2" 
    eval "${!1}" 
    typeset -p "$2" 
} 

typeset -a a=(a b c) 
myArr=$(typeset -p a) f myArr a 
0

आप एक सरणी को एक पर्यावरण चर में डालने की कोशिश कर रहे हैं, और पर्यावरण चर केवल तार हो सकते हैं। बैश में व्यवस्थित क्रमिकरण/deserializing सरणी के लिए एक विधि नहीं है; मैन्युअल रूप से ऐसा करें।

2

गलतफहमी यह सोचने में है कि पर्यावरण चर केवल गोले द्वारा उपयोग किए जाते हैं - वे नहीं हैं। रीडोनली, पूर्णांक, और सरणी समेत कोई विशेषता नहीं, पर्यावरण ब्लॉक में निर्यात की जा सकती है। पर्यावरण चर किसी भी भाषा, सी, सी ++, पर्ल, जावा, पायथन, PHP, और इसी तरह से पढ़ा जा सकता है। वे विंडोज पर भी मौजूद हैं।

तो, एक और भाषा बैश विशिष्ट विशेषताओं का समर्थन कैसे कर सकती है? सभी पर्यावरण चर को स्ट्रिंग में परिवर्तित कर दिया जाता है, बाश को छोड़कर जहां सरणी मानों को बिल्कुल निर्यात नहीं किया जाता है।

कॉर्न शैल केवल पहले तत्व को निर्यात करेगा। ksh93 कुछ exec कोर्न शैल बच्चों को निर्यात किए गए परिवर्तनीय विशेषताओं को संरक्षित करने के लिए शोषण भी करता है।

वैसे, इसे चरम नामों के लिए अपरकेस का उपयोग करने के लिए बुरी आदत माना जाता है, क्योंकि वे शैल द्वारा उपयोग किए गए लोगों के साथ टकरा सकते हैं। साथ ही, बैश 3 पर, निर्यात किए जाने पर STRING के नाम में समस्याएं हैं (बैश 4 में तय)।

0

प्रक्रियाओं से उनके बच्चों तक पारित पर्यावरण चर असंगठित तार हैं; सरणी समर्थित नहीं किया जा सकता है। आप बैश में इस प्रदर्शन कर सकते हैं:

export x=foo 
printenv x 

कि foo आउटपुट। अगर मैं अब x कारण एक सरणी

x=(foo bar) 
printenv x 

हम देख नहीं निर्गम (x निर्यात नहीं है) हो गया है।

संबंधित मुद्दे