मूल्य में पाउंड (हैश) के साथ / आदि / वातावरण में पर्यावरण चर


10

उबंटू 12.04 पर, मेरे पास /etc/environmentइस तरह से परिभाषित एक पर्यावरण चर है :

FOO="value_before#value_after"

जब मैं मूल्य की जांच करने के लिए सर्वर में ssh करता हूं, तो मुझे यह मिलता है:

$ env | grep FOO
FOO=value_before

मुझे लगता है कि यह #एक टिप्पणी के रूप में व्यवहार कर रहा है और इसे बाहर निकाल रहा है, हालांकि, यह काम करता है:

$ . /etc/environment
$ export FOO
$ env | grep FOO
FOO=value_before#value_after

मैंने #इस तरह से भागने की कोशिश की है :

FOO="value_before\#value_after"

लेकिन यह काम नहीं करता है, इसके बजाय मुझे बस यही मिलता है:

FOO=value_before\

मूल्य के हिस्से की तरह हैश बनाने के बारे में कोई विचार? कोई भी मदद बहुत अच्छी रहेगी।

मान मैंने /etc/environmentफ़ाइल में आज़माया है :

FOO='value_before#value_after'
FOO="value_before#value_after"
FOO='"value_before#value_after"'
FOO="value_before\#value_after"
FOO='value_before\#value_after'

और उपरोक्त के अन्य विभिन्न संयोजन। जब आप सामान्य रूप से उन्हें खोल में सेट करते हैं तो इनमें से बहुत सारे काम करेंगे। लेकिन वे /etc/environmentफ़ाइल में काम नहीं करते हैं ।

जवाबों:


5

इसे pam_env मॉड्यूल द्वारा पढ़ा जाता है। यह देखते हुए कि pam_env मॉड्यूल उन्हें "सरल" KEY = VALUE जोड़े (उद्धरण चिह्नों की आवश्यकता नहीं है) की अपेक्षा करता है और # द्वारा पहचानी गई टिप्पणियों का भी समर्थन करता है, यह मानता है कि VALUE में एक # और इसके बाद कुछ भी एक टिप्पणी है। इसके अलावा, ध्यान दें कि यह भागने की किसी भी अवधारणा का समर्थन नहीं करता है।

इसे निम्नलिखित स्निपेट में ppar_env.c में _parse_env_file फ़ंक्शन से देखा जा सकता है ।

/* now find the end of value */
mark = key;
while(mark[0] != '\n' && mark[0] != '#' && mark[0] != '\0')
    mark++;
if (mark[0] != '\0')
    mark[0] = '\0';

उपरोक्त स्निपेट VALUE भाग के प्रत्येक वर्ण को तब तक चलाती है जब तक कि यह एक \n, #या नहीं मिल जाता है \0। यह तब उस चरित्र को एक के साथ अधिलेखित करता है \0

यह प्रभावी रूप से #और सब कुछ निम्नलिखित स्ट्रिप्स । नोट: यह एक सुविधा है जो बग नहीं है। यह टिप्पणी की विशेषता है।

तो, इस बिंदु पर आप मूल्यों में नहीं हो सकता /etc/environmentहै कि एक में शामिल हैं #या एक \nया \0मूल्य के बीच में। यह उस कोड से भी दिखता है कि कुंजी को अल्फा-न्यूमेरिक होना चाहिए।


वाह, यह nailed! विस्तृत विवरण के लिए धन्यवाद, मैंने इसे स्वीकृत समाधान के रूप में चिह्नित किया है।
Jaymon

3

मैं इस सीमा के आसपास एक रास्ता नहीं ढूंढ पा रहा था /etc/environment, प्रलेखन यह बताता है कि /etc/environmentयह एक साधारण पर्यावरण फ़ाइल है:

This module can also parse a file with simple KEY=VAL pairs on separate 
lines (/etc/environment by default).

इसका मतलब यह हो सकता है कि यह आपको उद्धरण या \चरित्र का उपयोग करके मूल्यों से बचने नहीं देगा , प्रलेखन में अन्य स्थानों के बावजूद शायद यह कहना संभव है :

(Possibly non-existent) environment variables may be used in values using 
the ${string} syntax and (possibly non-existent) PAM_ITEMs may be used in 
values using the @{string} syntax. Both the $ and @ characters can be 
backslash escaped to be used as literal values values can be delimited with ""

या शायद नहीं :

The file is made up of a list of rules, each rule is typically placed on a
single line, [...] Comments are preceded with `#´ marks and extend to the 
next end of line.

वैसे भी, इस सीमा से बचने के लिए, मैं में एक फ़ाइल में मेरी वैश्विक वातावरण चर ले जाया गया /etc/profile.dके रूप में इस उत्तर में चर्चा की । मैं अभी भी इस प्रश्न को अनुत्तरित मानता हूं, लेकिन मैं यह सुनिश्चित करना चाहता था कि पोस्टरिटी के लिए लिंक किए गए वर्कअराउंड थे।


1

# से बचने के लिए / etc / वातावरण में कोई रास्ता नहीं है (जैसा कि यह एक टिप्पणी के रूप में माना जाता है) क्योंकि इसे PAM मॉड्यूल "pam_env" द्वारा पार्स किया जा रहा है और यह इसे KEY = VAL जोड़े की एक सरल सूची के रूप में मानता है और सेट करता है तदनुसार पर्यावरण। यह बैश / शेल नहीं है, पार्सर के पास चर विस्तार करने या भागने वाले पात्रों के लिए कोई भाषा नहीं है।


0

एकल कोट।

$ FOO='foo#bar'
$ echo $FOO
foo#bar

1
यह मेरे द्वारा आजमाए गए पहले मूल्यों में से एक था, जबकि यह शेल में काम करता है, दुख की बात है कि यह काम नहीं करता है /etc/environment, मैंने अपने प्रश्न को उन मूल्यों के कुछ उदाहरणों के साथ अपडेट किया है जिन्हें मैंने कोशिश की है।
Jaymon
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.