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


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.