जबकि पर्यावरण चर का कोई भी नाम हो सकता है (खाली स्ट्रिंग सहित) जिसमें समान चिह्न या अशक्त बाइट नहीं होता है, गोले शेल चर के लिए वातावरण चर को मैप करते हैं और अधिकांश शेल में, चर नाम 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))।