लिनक्स पर्यावरण चर नामों में स्वीकृत वर्ण


143

लिनक्स पर्यावरण चर नामों में कौन से वर्णों की अनुमति है? मैन पेज और वेब की मेरी सरसरी खोज ने केवल चर के साथ काम करने के तरीके के बारे में जानकारी उत्पन्न की, लेकिन उन नामों की अनुमति नहीं है।

मेरे पास एक जावा प्रोग्राम है जिसमें एक परिभाषित वातावरण चर की आवश्यकता होती है, जिसमें एक डॉट होता है, जैसे com.example.fancyproperty। विंडोज के साथ मैं उस वेरिएबल को सेट कर सकता हूं, लेकिन मेरे पास इसे लिनक्स में सेट करने का कोई सौभाग्य नहीं था (SuSE और Ubuntu में कोशिश की गई)। क्या उस परिवर्तनशील नाम की भी अनुमति है?


3
सौभाग्य से, मैंने पाया कि प्रोग्राम केवल जावा सिस्टम प्रॉपर्टी ( -Dकमांड लाइन विकल्प के साथ घोषित ) से खुश है , इसलिए यह अब काम करता है। जाहिर है कि कार्यक्रम मुझे बताए बिना दोनों चर सेट में दिखता है। लेकिन फिर भी मैं उत्सुक हूं कि किस पर्यावरण चर नाम की अनुमति है।
क्रिश्चियन सेमरू

@AleksandrDubinsky मैंने इसे हटा दिया। यह समान है, लेकिन उपनाम की परिभाषा के बारे में पर्यावरण चर नहीं हैं stackoverflow.com/questions/24690640/…
लाइम

1
आप उपयोग कर रहे हैं स्प्रिंग , तो डिफ़ॉल्ट SystemEnvironmentPropertySource भी दिखेगा com_example_fancypropertyऔर COM_EXAMPLE_FANCYPROPERTY
विएतनाम डबिन्स्की

जवाबों:


203

से ओपन समूह :

इन तारों का नाम = मान है; नामों में '=' ​​वर्ण नहीं होगा। मानों के लिए IEEE Std 1003.1-2001 के अनुरूप प्रणालियों के पोर्टेबल होने के लिए, मान पोर्टेबल वर्ण सेट ( NUL को छोड़कर और जैसा नीचे दिखाया गया है ) से वर्णों से बना होगा ।

इसलिए नामों में = और NUL को छोड़कर कोई भी वर्ण हो सकता है, लेकिन:

IEEE Std 1003.1-2001 के शेल और यूटिलिटीज वॉल्यूम में उपयोगिताओं द्वारा उपयोग किए जाने वाले पर्यावरण चर नाम में केवल बड़े अक्षर, अंक और '_' (अंडरस्कोर) होते हैं जो पोर्टेबल कैरेक्टर सेट में परिभाषित वर्णों से होते हैं और एक अंक से शुरू नहीं होते हैं। । अन्य पात्रों को एक कार्यान्वयन की अनुमति दी जा सकती है; आवेदन ऐसे नामों की उपस्थिति को सहन करेंगे।

इसलिए जब नाम मान्य हो सकते हैं, तो आपका शेल अक्षरों, संख्याओं और अंडरस्कोर के अलावा कुछ भी समर्थन नहीं कर सकता है।


8
बस जाँच करना: दूसरा उद्धरण गैर-मानक है: यह सिर्फ यह देखता है कि POSIX को विशेष रूप से परिभाषित करने के लिए उपयोगिताओं के रूप में परिभाषित करने वाले चर हैं [a-zA-Z_][a-zA-Z0-9_]*(इस रूप में स्पष्ट रूप से सुझाव है कि यह बहुत ही कम है), लेकिन वास्तविक कल्पना (बोली 1) को कुछ भी समर्थन करने के लिए सभी कार्यान्वयन की आवश्यकता है लेकिन =और NUL?
सिरो सेंटिल्ली 13 i iro i 法轮功 '21

3
इसके अलावा, "पोर्टेबल कैरेक्टर सेट" pubs.opengroup.org/onlinepubs/000095399/basedefs/… में स्पेस और नॉन-प्रिंटेबल जैसे सामान शामिल हैं: तो क्या हम उन चीजों का उपयोग कर सकते हैं या नहीं?
सिरो सेंटिल्ली 郝海东 i iro i 法轮功 '21

3
यह वही है जो मैं निरीक्षण करता हूं। शेल एक चर नाम के एक भाग के रूप में विशेष वर्णों को पसंद नहीं करता है। हालाँकि जब एक प्रोग्राम या स्क्रिप्ट (जैसे जावा या पर्ल) अपने नाम में विशेष वर्णों के साथ एक चर को इनिशियलाइज़ करता है और किसी अन्य निष्पादन योग्य (एक चाइल्ड प्रोसेस) को कॉल करता है तो बाद वाला निष्पादन योग्य उस चर को बिना किसी समस्या के एक्सेस कर सकता है।
o

1
@checksum, UPPERCASE स्पष्ट रूप से शेल सहित POSIX- निर्दिष्ट साधनों के लिए परिवर्तनीय नामों के लिए निर्दिष्ट है; कम से कम एक कम-केस चरित्र वाले नाम स्पष्ट रूप से आवेदन उपयोग के लिए आरक्षित हैं। इस प्रकार, सबसे अच्छा अभ्यास वास्तव में आपके अनुप्रयोगों के चर नामों में कम से कम एक कम-पात्र चरित्र को शामिल करना है ताकि यह सुनिश्चित किया जा सके कि आप अनजाने में ओवरराइटिंग नहीं कर रहे हैं (शेल चर सेट करने से किसी भी नाम वाले पर्यावरण चर को अधिलेखित कर दिया जाएगा) प्रणाली। देखें pubs.opengroup.org/onlinepubs/9699919799/basedefs/...
चार्ल्स डफी

2
@CiroSantilli 烏坎 iro 2016 事件 ill ill, आप उन्हें पर्यावरण चर में उपयोग कर सकते हैं; आप उन्हें शेल चर में उपयोग नहीं कर सकते हैं , और उन पर्यावरण चर को शेल से सुलभ होने की गारंटी नहीं है।
चार्ल्स डफी

37

IEEE Std 1003.1-2008 / IEEE POSIX P1003.2 / ISO 9945.2 शेल और टूल मानक के गोले अनुभागों पर POSIX मानक चर नामों के लिए शाब्दिक सम्मेलन को परिभाषित नहीं करते हैं, हालांकि स्रोत पर एक सरसरी नज़र से पता चलता है कि यह कुछ इसी तरह का उपयोग करता है

[a-zA-Z_]+[a-zA-Z0-9_]*

(संपादित करें: 2 वर्ण वर्ग में लापता अंडरस्कोर जोड़ा गया है।)

एक त्वरित नोट, कुछ गोले regex में + का समर्थन नहीं करते हैं, एक संभावित रूप से अधिक पोर्टेबल regex हो सकता है:

[a-zA-Z_]{1,}[a-zA-Z0-9_]{0,}


4
धन्यवाद, आइडेन। मुझे लगता है कि वर्ग कोष्ठक के दूसरे सेट में एक अंडरस्कोर गायब है: इसे शायद पढ़ा जाना चाहिए: [a-zA-Z_][a-zA-Z0-9_]* मेरे जैसे उन लोगों के लिए जो बैश-4.1 के संदर्भ को थोड़ा अस्पष्ट समझते हैं (कोड की 616'000 लाइनें), यहां कुछ संकेत दिए गए हैं कोड की प्रासंगिक पंक्तियों को खोजें: subst.c: param_expand(), in the default case-> general.h:/ * परिभाषित करें कि कानूनी रूप से कौन से शेल पहचानकर्ता हैं। * / #define legal_variable_starter (c) (ISALPHA (c) || ​​(c == ' ')) #define legal_variable_char (c) (ISALNUM (c) || ​​c = ' ))
Chris

3
आपको पहले चरित्र वर्ग में उस प्लस की आवश्यकता नहीं है।
खण्ड

2
@ सच है, हालांकि मैं स्रोत से regexp ले लिया, तो मैं में रखने के लिए जा रहा हूँ
Aiden बेल

4
POSIX परिभाषित करता है: 3.231 नाम a word consisting solely of underscores, digits, and alphabetics from the portable character set. The first character of a name is not a digit

शेल सेक्शन में नहीं, लेकिन पूरी तरह से POSIX मानक हैं जिनमें पर्यावरण चर नामकरण के लिए कन्वेंशन शामिल हैं (और वास्तव में उन नामों पर चर्चा करते हैं जो शेल उपयोग के लिए आरक्षित हैं)। देखें pubs.opengroup.org/onlinepubs/9699919799/basedefs/...
चार्ल्स डफी

12

मेरे त्वरित परीक्षण से पता चला कि वे मूल रूप से उन्हीं नियमों का पालन करते हैं जैसे कि सी चर नाम हैं

  1. az, AZ, _और 0-9
  2. एक नंबर से शुरू नहीं हो सकता

तो यह .उनके अंदर बाहर करता है। किसी भी अवैध परिवर्तनशील नाम को श्रेय दिया जाता है unknown command

यह ZSH में परीक्षण किया गया था, जो कि ज्यादातर BASH- संगत है।


6

इस बात पर निर्भर करता है कि आपको 'अनुमत' से क्या मतलब है।

गैर के लिए Windows की उपेक्षा:

पर्यावरण स्ट्रिंग का एक सरणी है, जो एक कार्यक्रम के मुख्य कार्य में पारित होता है। यदि आप निष्पादित (2) पढ़ते हैं, तो आप अशक्त-समाप्ति के अलावा इन तारों पर कोई आवश्यकता या सीमा नहीं देखेंगे।

अधिवेशन के अनुसार, प्रत्येक स्ट्रिंग में NAME = मान होता है। कोई भी कन्वेंशन नहीं है, इसलिए आप इस कन्वेंशन में नाम में '=' ​​नहीं रख सकते।

सामान्य मनुष्य इन कवच को अपने खोल के साथ चर्चा करके निर्धारित करते हैं। प्रत्येक शेल के अपने विचार हैं कि मान्य वैरिएबल NAME क्या हैं, इसलिए आपको शेल पेज के लिए मैन पेज पढ़ना होगा, यह देखने के लिए कि यह क्या सोचता है।

आम तौर पर, com.baseball.spit = fleagh जैसी चीजें जावा सिस्टम गुण हैं, और कुछ जावा प्रोग्राम पर्यावरण में वापस आने के लिए तैयार हैं या नहीं, उन्हें -D के साथ निर्दिष्ट करना बेहतर है।


मुझे पहले इस निष्कर्ष पर आना चाहिए था कि चर को जावा सिस्टम गुण की तरह स्वरूपित किया गया है, बजाय इसे पर्यावरण चर के रूप में सेट करने की कोशिश के।
क्रिश्चियन सेमरू

5

यह शेल पर निर्भर करता है। मैं अनुमान लगा रहा हूं कि आप डिफ़ॉल्ट रूप से बैश का उपयोग कर रहे हैं, जिस स्थिति में अक्षरों, संख्याओं और अंडरस्कोर की अनुमति है, लेकिन आप एक नंबर के साथ चर नाम शुरू नहीं कर सकते। बैश v.3 के रूप में, परिवर्तनशील नामों के भीतर अवधियों की अनुमति नहीं है


4

हां तुम यह कर सकते हो।

इस दृश्य को लागू करने के लिए उपयोग करें execऔर envआदेश दें।

डॉकटर में टेस्ट फिक्सचर

docker run -it --rm alpine:3.10

कंटेनर में कमांड चलाएँ:

exec env spring.application_name=happy-variable-name ${SHELL:-/bin/sh}

पर्यावरण चर सत्यापित करें:

HOSTNAME=bd0bccfdc53b
SHLVL=2
HOME=/root
spring.application_name=happy-variable-name
TERM=xterm
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
PWD=/

उपयोग ps auxPID को सत्यापित करने के लिए नहीं बदला गया

PID   USER     TIME  COMMAND
    1 root      0:00 /bin/sh
   12 root      0:00 ps aux

pythonEnvironemnt चर को सत्यापित करने के लिए उपयोग करें

apk add python
python -c 'import os; print(os.environ["spring.application_name"])'

OUTPUT है happy-variable-name

क्या हुआ?

  1. शेल कॉल बिलिन निष्पादन
  2. शेल बिल्डिन निष्पादित कॉल syscall.exec वर्तमान शेल को बदलने के लिए प्रक्रिया 'env' बनाता है
  3. env प्रक्रिया कॉल syscall.execvp, env प्रक्रिया को बदलने के लिए '/ bin / sh' प्रक्रिया बनाती है

दूसरा रास्ता

  • डॉकटर छवि

यदि आप docker का उपयोग कर रहे हैं, तो आप Dockerfile में वैरिएबल सेट कर सकते हैं

FROM busybox
ENV xx.f%^&*()$#ff=1234
  • कुबेरनेट्स विन्यास

यदि आप kubernetes का उपयोग कर रहे हैं, तो आप configMap द्वारा चर सेट कर सकते हैं

test.yaml

apiVersion: v1
kind: ConfigMap
metadata:
  name: foo-config
data:
  "xx.ff-bar": "1234"

---
apiVersion: v1
kind: Pod
metadata:
  name: foobar
spec:
  containers:
    - name: test-container
      image: k8s.gcr.io/busybox
      command: [ "/bin/sh", "-c", "env" ]
      envFrom:
      - configMapRef:
          name: foo-config
  restartPolicy: Never

फली परोसें kubectl apply -f test.yaml

kubectl logs foobarआउटपुट सत्यापित करें :

xx.ff-bar=1234

विन्यास मानचित्र '-', '_' या '' की अनुमति देता है।


0

जबकि अधिकांश शेल एनवायरमेंट वैरिएबल सेट करने की अनुमति नहीं देंगे (जैसा कि अन्य उत्तरों में उल्लेख किया गया है), यदि आपको आवश्यकता है तो आप गैर-मानक एनवायरमेंट वेरिएबल्स के साथ अन्य प्रोग्राम्स का उपयोग कर सकते हैं env(1)

उदाहरण के लिए, सभी एनवायरमेंट को मिटाना और Strange.Env:Varमान को सेट करना fooऔर इसे प्रिंट करने वाले पर्ल प्रोग्राम को निष्पादित करना:

env -i Strange.Env:Var=foo perl -MData::Dumper -E 'say Dumper(\%ENV)'

छप जाएगा

$VAR1 = {
          'Strange.Env:Var' => 'foo'
        };
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.