सभी उप गोले में उपलब्ध होने के लिए एक एनवी चर निर्यात करें, और संशोधित करना संभव है?


22

मान लो मेरे पास है

export MY_VAR=0

में है ~/.bashrc

मेरे पास एक खुला गनोम टर्मिनल है, और इस टर्मिनल में, मैं $MY_VARमान को बदल देता हूं 200। इसलिए, अगर मैं करता हूँ

echo $MY_VAR

इस टर्मिनल में, 200दिखाया गया है।

अब, मैंने अपने गनोम टर्मिनल में एक और टैब खोला, और किया

echo $MY_VAR

... और इसके बजाय 200, मेरे पास है 0

जब एक टर्मिनल एक पर्यावरण चर को संशोधित करता है, तो यह 200 मान को बनाए रखने के लिए मुझे क्या करना चाहिए? क्या यह संभव है?

जवाबों:


23

पर्यावरण की एक प्रति उप-गोले तक फैलती है, इसलिए यह काम करता है:

$ export MY_VAR=200
$ bash
$ echo $MY_VAR
200

लेकिन चूंकि यह एक प्रति है, आप उस मूल्य को मूल शेल तक प्राप्त नहीं कर सकते हैं - पर्यावरण को बदलकर नहीं, कम से कम।

ऐसा लगता है कि आप वास्तव में एक कदम आगे जाना चाहते हैं, जो कि कुछ ऐसा बनाना है जो एक वैश्विक चर की तरह काम करता है, जिसे "सिबलिंग" गोले द्वारा अलग-अलग जनक से शुरू किया गया है - जैसे गनोम टर्मिनल में आपका नया टैब।

ज्यादातर, जवाब "आप नहीं कर सकते, क्योंकि पर्यावरण चर उस तरह से काम नहीं करते हैं"। हालांकि, एक और जवाब है, जो है, ठीक है, आप हमेशा कुछ हैक कर सकते हैं। एक दृष्टिकोण यह होगा कि चर का मान किसी फ़ाइल में लिखें, जैसे ~/.myvar, और फिर उस में शामिल करें ~/.bashrc। फिर, प्रत्येक नया शेल शुरू होगा उस फ़ाइल से पढ़े गए मूल्य से ।

आप एक कदम और आगे बढ़ सकते हैं - ~/.myvarप्रारूप में हों MYVAR=200, और फिर सेट करें PROMPT_COMMAND=source ~/.myvar, जिससे मूल्य आपको हर बार नया संकेत मिलने पर फिर से पढ़ने के लिए प्रेरित करेगा। यह अभी भी नहीं है काफी एक साझा वैश्विक चर, लेकिन यह यह की तरह काम करना शुरू कर रहा है। यह तब तक सक्रिय नहीं होगा जब तक एक संकेत वापस नहीं आता है, हालांकि, जो आप करने की कोशिश कर रहे हैं उसके आधार पर एक गंभीर सीमा हो सकती है।

और फिर, निश्चित रूप से, अगली बात यह है कि परिवर्तनों को स्वचालित रूप से लिखना है ~/.myvar। यह थोड़ा और जटिल हो जाता है, और मैं इस बिंदु पर रुकने जा रहा हूं, क्योंकि वास्तव में, पर्यावरण चर एक अंतर-शेल संचार तंत्र नहीं थे, और इसे करने के लिए सिर्फ एक और तरीका खोजना बेहतर है।


10
मैं टॉर्चर के तहत शेल

हाँ क्षमा करें। इसलिए मैं रुक गया। :)
19

"जो कुछ वैसा ही बनाना है जो एक वैश्विक वैरिएबल की तरह काम करता है" - ठीक है, वास्तव में, यही वह है जो मैं acomplish करने की कोशिश कर रहा था। ~ / .Myvar सुंदर नहीं है, लेकिन यह काम करता है। क्या आपके पास एक और सुझाव है?
कोई अब भी आपको MS-DOS

2
खैर, थोड़ा पीछे चलते हैं। आप एक वैश्विक चर क्यों चाहते हैं?
Mattdm

1
@mattdm: मेरे पास कुछ "नौकरशाही" हैं जिनका मुझे पालन करना होगा। उनमें से एक कोड का एक गुच्छा है जिसे मुझे एक टिप्पणी के साथ प्रतिबद्ध करने की आवश्यकता है। ये कोड अब, एक फ़ोल्डर पदानुक्रम (घर / उपयोगकर्ता / प्रोजेक्ट / प्रोजेक्टकोड / कोड 1 / कोड 2) में हैं। मैंने एक फ़ंक्शन बनाया, जो कोड 1 और कोड 2 को एनवी वर्जन के लिए निकालता है (इसलिए जब मुझे कोई गतिविधि करने की आवश्यकता होती है, तो मैं कोड के साथ डिर के अंदर फ़ंक्शन को कॉल करता हूं), और उन्हें, जब मैं आता हूं, तो मैं विम का उपयोग करता हूं और कुछ ऐसे हैं इन संस्करणों को पढ़ें और अपने आप टिप्पणी में डाल दें। मुझे लगता है कि इसके लिए फ़ाइलों का उपयोग करना एक समाधान हो सकता है।
कोई अभी भी आपको MS-DOS

13

मान लीजिए मैं export MY_VAR=0में ~/.bashrc

वहीं आपकी गलती है। ~/.profileजब आप लॉग इन करते हैं तो आपको अपने पर्यावरण चर को परिभाषित करना चाहिए , जिसे आप खोलते ~/.bashrcसमय पढ़ते हैं। जब आप आंतरिक शेल शुरू करते हैं, तो यह ओवरराइड हो जाता हैMY_VAR । यदि आपने ऐसा नहीं किया है, तो आपका पर्यावरण चर नीचे की ओर फैल जाएगा।

~/.bashrcबनाम पर अधिक जानकारी के लिए ~/.profile, इस विषय पर मेरी पिछली पोस्ट देखें

ध्यान दें कि ऊपर की ओर प्रसार (उपकेंद्र से स्वचालित रूप से मूल शैल में परिलक्षित मान प्राप्त करना) पूर्ण विराम संभव नहीं है।



3

पर्यावरण चर का उपयोग बिल्कुल न करें। फ़ाइलों का उपयोग करें।

फ़ाइल को अपडेट / पढ़ते समय एक-दूसरे पर प्रक्रियाओं को रोकने से रोकने के लिए, लॉकफ़ाइल्स और छोटे फ्रंट-एंड अपडेटर स्क्रिप्ट का उपयोग करें, जिसका उद्देश्य केवल एक फ़ाइल के साथ $ 1 अपडेट कर रहा है यदि यह लॉक नहीं है। लॉकफ़ाइल्स को मूल रूप से जाँचने के द्वारा कार्यान्वित किया जाता है यदि कोई विशिष्ट फ़ाइल मौजूद है (/var/run/yourscript.lck) और यदि ऐसा होता है, तो फ़ाइल के थोड़ी देर के लिए गायब होने की प्रतीक्षा करें, और यदि ऐसा नहीं होता है तो असफल हो जाते हैं। फ़ाइल अपडेट करते समय आपको लॉकफ़ाइल को भी हटाना होगा।

ऐसी स्थिति से निपटने के लिए तैयार रहें जहां कोई स्क्रिप्ट फ़ाइल को अपडेट नहीं कर सकती क्योंकि फ़ाइल व्यस्त है।


8
एक चाल: लॉकिंग के लिए फ़ाइलों के बजाय निर्देशिकाओं का उपयोग करें, क्योंकि mkdirपरमाणु परीक्षण और निर्माण के रूप में काम करता है।
२०

1
यदि आप लोग लॉकिंग के बारे में बात करना चाहते हैं, तो आप उपयोग कर सकते हैंflock(2)
एहतेश चौधरी

@mattdm मैंने पाया कि एक सिम्लिंक ln -s dummy lockfile(भले ही टूट गया हो) भी काम कर सकता है क्योंकि यह सिफलिंक पहले से मौजूद होने पर विफल हो जाएगा। मुझे आश्चर्य है कि परीक्षण करने का कोई तरीका है अगर यह वास्तव में 100% सुरक्षित है।
कुंभ राशि पावर

1

जब मैंने अभी-अभी इस सवाल को उठाया है, मैं सब्स्क्राइब होने से स्टेट्स (शेल शेल) अपडेट करने की समस्या को हल करने की कोशिश कर रहा था। ताकि कोई व्यक्ति एक पाइपलाइन के अंदर, चर कह सकता है - और असाइनमेंट पारदर्शी रूप से माता-पिता को दिखाई देगा।

बेशक, यह एक सरल तरीके से संभव नहीं है क्योंकि एक पाइपलाइन के अलग-अलग हिस्सों को उपधाराओं में निष्पादित किया जाता है, जो forkकि माता-पिता के खोल से एड होते हैं और इसलिए स्मृति होती है जो माता - पिता की स्मृति पर कॉपी-ऑन-राइट व्यू है। हालांकि, मेरा मानना ​​था कि आईपीसी के " साझा मेमोरी " प्रकार के आधार पर पतला और पारदर्शी समाधान संभव हो सकता है

और मुझे एक कार्यान्वयन भी मिला है वास्तव में इस डिजाइन के ... लेकिन यह पर्ल में है।

एक संभावित समाधान के रूप में वैसे भी इस जवाब को जोड़ना।

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