इसमें डॉट (।) के साथ एक चर निर्यात करना


38

एक वैरिएबल को कैसे निर्यात करें, जिसमें डॉट है। जब मैंने कोशिश की तो मुझे 'अमान्य चर नाम' मिला:

 export my.home=/tmp/someDir
-ksh: my.home=/tmp/someDir: invalid variable name

यहां तक ​​कि मेटाचैकर डॉट (।) से बचकर भी मदद नहीं की

$ export my\.home=/tmp/someDir
export: my.home=/tmp/someDir: is not an identifier


1
दुर्भाग्य से यह सूचीबद्ध नहीं है जब मैंने टाइप किया / समान प्रश्न खोजा। माफ़ कीजिये। ..
user1587504

जवाबों:


49

कम से कम bashमैन पेज के लिए निर्यात सिंटैक्स को परिभाषित करता है:

export [-fn] [name[=word]] ...

यह "नाम" को भी परिभाषित करता है:

   name   A  word  consisting  only  of alphanumeric characters and under
          scores, and beginning with an alphabetic character or an  under
          score.  Also referred to as an identifier.

इसलिए आप वास्तव में एक चर को परिभाषित नहीं कर सकते हैं जैसे my.homeकि यह कोई मान्य पहचानकर्ता नहीं है।

मुझे पूरा यकीन है कि आपकी ksh की पहचानकर्ता की समान परिभाषा है और इसलिए इस प्रकार के चर को भी अनुमति नहीं देती है। (इसके मैन पेज पर एक नजर डालें।)

मैं यह भी सुनिश्चित करता हूं कि किसी प्रकार का सामान्य मानक (POSIX?) निर्दिष्ट है, जिसे पहचानकर्ता के रूप में अनुमति दी जाती है (और इसलिए एक चर नाम)।


यदि आपको वास्तव में किसी कारण से इस तरह के चर की आवश्यकता है तो आप कुछ का उपयोग कर सकते हैं

env "my.home=/tmp/someDir" bash

वैसे भी इसे परिभाषित करने के लिए। लेकिन फिर, आप सामान्य शेल सिंटैक्स का उपयोग करके इसे एक्सेस नहीं कर पाएंगे। इस मामले में आपको शायद perl जैसी किसी अन्य भाषा की आवश्यकता है:

perl -e 'print $ENV{"my.home"}'

उदाहरण के लिए

env "my.home=/tmp/someDir" perl -le 'print $ENV{"my.home"}'

अपना रास्ता छापना चाहिए।


यह चींटी के एकीकरण के कारण है। और दुर्भाग्य से यह unix से वैरिएबल को सेट / एक्सपोर्ट करने की अनुमति नहीं देता है। आपके उत्तर को स्वीकार करना। ..
user1587504

1
चींटी को आम तौर पर ANT_OPTS~ या .antrc नामक एकल परिवेश चर द्वारा कॉन्फ़िगर किया जाता है । चींटी के लिए अजीब पर्यावरण चर नामों की कोई आवश्यकता नहीं है।
माइक्स

8

जबकि पर्यावरण चर का कोई भी नाम हो सकता है (खाली स्ट्रिंग सहित) जिसमें समान चिह्न या अशक्त बाइट नहीं होता है, गोले शेल चर के लिए वातावरण चर को मैप करते हैं और अधिकांश शेल में, चर नाम ASCII अल्फ़ान्यूमेरिकल वर्णों तक सीमित होते हैं और _जहां पहला वर्ण हो सकता है ' टी अंक हो (स्थितीय मापदंडों और जैसे अन्य विशेष को छोड़कर $*, $-, $@, ..., (इसी वातावरण चर पर मैप नहीं किया जाता है))। यह भी ध्यान दें कि कुछ चर शेल द्वारा आरक्षित / विशेष हैं

इसके अपवाद:

  • rcखोल और की तरह अपने डेरिवेटिव esऔर akangaरिक्त स्ट्रिंग को छोड़कर किसी भी नाम का समर्थन है, और उन है कि सभी संख्यात्मक हैं या शामिल =वर्ण (और हमेशा पर्यावरण के लिए उनके सभी चर निर्यात करते हैं, और विशेष चरों से सावधान चाहते *, status, pid...):

    ; '%$£"' = test
    ; echo $'%$£"'
    test
    ; '' = x
    zero-length variable name
    ;

    हालाँकि, यह वैरिएबल के लिए अपनी एन्कोडिंग का उपयोग करता है, जिसका नाम अलनम्स या सरणियों के लिए नहीं है जब इसे निष्पादित किए जा रहे कमांडों के वातावरण में पारित किया जाता है:

    $ rc -c '+ = zzz; __ = zzz; a = (zzz xxx); env' | sed -n /zzz/l
    __2b=zzz$
    __5f_=zzz$
    a=zzz\001xxx$
    $ env +=x rc -c "echo $'+'"
    x
    $ env __2b=x rc -c "echo $'+'"
    x
  • एटी एंड टी ksh, yashऔर zsh( bashकेवल लेकिन एकल-बाइट पात्रों के लिए) वर्तमान लोकेल में न केवल ASCII वाले का समर्थन करते हैं।

    $ Stéphane=1
    $ echo "$Stéphane"
    1

    उन गोले में, आप अधिकांश वर्णों को अल्फ़ा मानने के लिए स्थान बदल सकते हैं, लेकिन फिर भी वे ASCII वर्णों के लिए काम नहीं करेंगे .। आप मूर्ख हो सकते हैं zshया kshसोच सकते हैं £कि एक पत्र है, लेकिन ऐसा नहीं है कि .कोई अन्य ASCII चरित्र (जहां वर्ण नाम में वर्णों की अनुमति है, [[:alpha:]]उदाहरण के लिए ग्लोब के लिए नहीं)।

  • ksh93विशेष चर होते हैं जिनके नाम में एक बिंदु होता है जैसे कि ${.sh.version}, लेकिन वे पर्यावरण चर के लिए मैप नहीं किए जाते हैं और विशेष होते हैं। यह .सुनिश्चित करना है कि यह अन्य चर के साथ संघर्ष नहीं करता है। यदि उसने इसे कॉल करने के लिए चुना था $sh_version, तो यह संभावित रूप से टूटी हुई स्क्रिप्ट हो सकती थी जो पहले से ही उस चर का इस्तेमाल करती थी (उदाहरण के लिए देखें कि zshइसके $pathया $commandsविशेष सरणी / हैश चर (ला csh) जो कुछ स्क्रिप्ट को तोड़ते हैं) के साथ समस्याएँ कैसे हैं ।

ध्यान दें कि उन चर का समर्थन न करने वाले गोले के अलावा, pdksh / mksh जैसे कुछ गोले उन्हें प्राप्त होने वाले वातावरण से हटाते हैं ( bashएक खाली नाम वाले व्यक्ति को हटाते हैं ash, kshऔर bashउन पर्यावरण तारों को हटा देते हैं जिनमें एक =वर्ण नहीं होता है ):

$ env %%%=test 1=%%% a.b=%%% mksh -c env | grep %%%
$ env %%%=test 1=%%% a.b=%%% bash -c env | grep %%%
%%%=test
a.b=%%%
1=%%%

$ perl -le '$ENV{""}="%%%"; exec "bash", "-c", "env"' | grep %%%
$ perl -le '$ENV{""}="%%%"; exec "zsh", "-c", "env"' | grep %%%
=%%%

$ echo 'main(){char*a[]={"sh","-c","env",0};char*e[]={"%%%",0};
    execve("/bin/ash",a,e);}'|tcc -run - | grep %%%
$ echo 'main(){char*a[]={"sh","-c","env",0};char*e[]={"%%%",0};
    execve("/bin/zsh",a,e);}'|tcc -run - | grep %%%
%%%

योग करने के लिए, सबसे अच्छा है कि ज्यादातर गोले द्वारा समर्थित चर नामों के साथ चिपके रहें और यहां तक ​​कि पर्यावरण चर के लिए ऊपरी मामले का उपयोग करने की कोशिश करें (और निचले मामले या निर्यात नहीं किए गए खोल चर के लिए मिश्रित मामला) से बचने के लिए जो गोले में विशेष हैं (जैसे IFS, PS1) BASH_VERSION...)।

यदि आपको शेल में ऐसा कोई वैरिएबल सेट करने की आवश्यकता है, जो उनका समर्थन नहीं करता है, लेकिन उन्हें त्याग नहीं करता है, तो आप अपने आप को पुनः प्राप्त कर सकते हैं, जैसे कुछ:

#! /bin/ksh -
perl -e 'exit 1 unless defined($ENV{"a.b"})' || exec env a.b=%%% "$0" "$@"

(जाहिर है, अगर आपको इसे स्क्रिप्ट के बीच में करने की ज़रूरत है, तो यह मदद नहीं करेगा, लेकिन आप फिर से निष्पादन पर शेल निष्पादन वातावरण को बचाने और पुनर्स्थापित करने के लिए उस दृष्टिकोण पर एक नज़र डाल सकते हैं )। या डिबगर दृष्टिकोण का प्रयास करें:

gdb --batch-silent -ex 'call putenv("a.b=%%%")' --pid="$$"

(है कि एक के साथ काम करने लगता है zsh, yash, cshऔर tcshलिनक्स amd64 पर है, लेकिन अन्य गोले मैंने कोशिश की (से किसी के साथ नहीं mksh, ksh93, bash, dash))।


1
mksh(और pdksh) वास्तव में उन पर्यावरण प्रक्रियाओं का निर्माण करते हैं जो वे स्पॉन पूरी तरह से खरोंच से प्राप्त करते हैं, वर्तमान शेल निष्पादन पर्यावरण में निर्यात किए गए केवल उन मापदंडों का उपयोग करते हैं, इसलिए उन गोले के माध्यम से उन चर को पारित करने का कोई तरीका नहीं है। (ध्यान दें कि जो चर पास किए गए हैं वे परिवर्तन के अधीन हैं; उदाहरण के लिए मैं mkshकिसी दिन सरणी निर्यात का समर्थन करने की योजना बना रहा हूं ।)
mirabilos

0

जैसा कि अन्य पोस्ट बताते हैं, सबसे सामान्य शेल नाम में अवधि के साथ पर्यावरण चर सेट करने की अनुमति नहीं देते हैं। हालाँकि, मुझे ऐसी स्थितियाँ मिली हैं, जिनमें विशेष रूप से डॉकर और इनवॉक्ड प्रोग्राम शामिल हैं, जहाँ सॉफ्टवेयर को पीरियड्स के लिए मुख्य मूल्यों की आवश्यकता होती है।

हालांकि, इन स्थितियों में से प्रत्येक में, उन कुंजी-मूल्य जोड़े को केवल पर्यावरण चर की तुलना में अन्य माध्यमों से कार्यक्रम में पारित किया जा सकता है। उदाहरण के लिए, चींटी में, आप "-प्रोपराइटल (फाइलनाम)" का उपयोग कर सकते हैं, जो कुंजी-मानों के एक संपत्ति फ़ाइल स्वरूपित संग्रह में पारित करने के लिए है। Confd "-backend फ़ाइल -file (yaml फ़ाइल)" के लिए अनुमति देता है।

मैंने पर्यावरण चर "C__any_value = 'my.property.key = मान'" के रूप में पारित किया। मैंने फ़ाइल को पहले जनरेट करने के लिए प्रोग्राम इनवोकेशन को स्विच किया:

set | awk -- 'BEGIN { FS="'\''" } /^C__/ {print $2}' > my-key-values.txt

setआदेश, बोर्न शेल, इच्छा उत्पादन के रूप में एक अलग लाइन पर प्रत्येक प्रॉपर्टी में स्थित

C__any_value='my.property.key=the value'

awkआदेश केवल वातावरण चर के साथ शुरू पर कार्रवाई करेंगे C__, तो मान एकल उद्धरण में निहित निकालें।

इस विधि के लिए पर्यावरण चर मान को सटीक रूप में सेट किया जाना चाहिए जिसे प्रसंस्करण कार्यक्रम की आवश्यकता होती है। इसके अतिरिक्त, यदि आपके संपत्ति मूल्य या कुंजी में एकल उद्धरण शामिल होंगे, तो आपको awk क्षेत्र विभाजक चरित्र को कुछ ऐसी चीजों में बदलना होगा जो आपको पता है कि प्रकट नहीं होगी, और उस चरित्र के साथ मूल्य को घेर लें। उदाहरण के लिए, %विभाजक के रूप में उपयोग करने के लिए :

$ C__1="%my.key=the'value%"
$ set | awk -- 'BEGIN { FS="%" } /^C__/ {print $2}'
my.key=the'"'"'value

(सटीक आउटपुट आपके शेल पर निर्भर करेगा।) उद्धरण से बचने के लिए आपको अतिरिक्त कदम उठाने होंगे।

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