"निर्यात" कमांड का उपयोग क्या है?


12

मैंने एक टर्मिनल विंडो में एक पर्यावरण चर बनाया और इसे दूसरे टर्मिनल विंडो में प्रतिध्वनित करने की कोशिश की। वह कुछ भी नहीं दिखा।

$TEST=hello

उसके बाद मैंने इसे निर्यात किया और echoएक अलग टर्मिनल विंडो में फिर से कोशिश की । परिणाम पहले जैसा ही था।

export TEST 

लेकिन अगर मैं लॉगिन पर एक ही कोड निष्पादित करता हूं (कोड को ~/.profileफाइल करने के लिए जोड़कर ) चर किसी भी टर्मिनल विंडो का उपयोग किया जा सकता है। यहां क्या हो रहा है? एक टर्मिनल में एक कोड को निष्पादित करने और लॉगिन पर एक ही निष्पादित करने के बीच क्या अंतर है?

जवाबों:


26

exportएक चर कुछ बनाता है जिसे बाल प्रक्रिया वातावरण में शामिल किया जाएगा। यह पहले से मौजूद अन्य वातावरण को प्रभावित नहीं करता है। सामान्य तौर पर एक टर्मिनल में एक चर सेट करने का एक तरीका नहीं है और यह स्वचालित रूप से दूसरे टर्मिनल में दिखाई देता है, पर्यावरण अपने आप ही प्रत्येक प्रक्रिया के लिए स्थापित हो जाता है।

इसे अपने में जोड़ने .profileसे यह ऐसा हो जाता है कि आपके वातावरण को उस नए चर को शामिल करने के लिए सेटअप किया जाएगा, जब भी आप लॉग इन करते हैं। इसलिए इसे एक शेल से दूसरे में एक्सपोर्ट नहीं किया जा रहा है, बल्कि एक नए शेल को निर्देश दिया जा रहा है कि इसे तब शामिल किया जाए जब यह प्रारंभिक वातावरण सेट करता है।


1

प्रत्येक प्रक्रिया में कई विशेषताएं होती हैं जो प्रक्रिया व्यक्तिगत रूप से और स्वतंत्र रूप से अन्य प्रक्रियाओं से निर्धारित कर सकती है। उदाहरण संसाधन सीमा, उमस्क, वर्तमान निर्देशिका, पर्यावरण चर और कुछ और हैं। प्रक्रिया के निर्माण पर ( fork()सिस्टम कॉल के माध्यम से) बच्चा माता-पिता से इन विशेषताओं को प्राप्त करता है। इसके बाद बच्चे की प्रक्रिया इन विशेषताओं को मनमाने ढंग से निर्धारित कर सकती है। (कुछ प्रतिबंध लागू होते हैं, एक प्रक्रिया हार्ड संसाधन सीमा को बढ़ा नहीं सकती है या इसकी वर्तमान निर्देशिका को एक निर्देशिका में बदल सकती है जिसके लिए इसकी कोई अनुमति नहीं है।)

केवल कुछ प्रोग्राम अपने पर्यावरण चर को संशोधित करते हैं, सबसे ज्यादा परेशान नहीं करते हैं। मान लीजिए बाद वाला मामला। इसलिए यदि एक बच्चे की प्रक्रिया खुद को आगे के बच्चे बनाती है, तो इन प्रक्रियाओं में दादा-दादी के समान पर्यावरण चर होंगे। और इसी तरह।

अब, एक शेल में बहुत सारे वैरिएबल होते हैं जिन्हें set(बॉर्न शेल प्रकार के गोले में, सी शेल के बारे में पता नहीं) के साथ देखा जा सकता है । ये चर पर्यावरणीय चर नहीं हैं जब तक कि वे exportएड न हों। पर्यावरण चर के साथ देखा जा सकता है env। यदि आप शेल कमांड लाइन से एक प्रोग्राम लॉन्च करते हैं, तो प्रोग्राम शेल से पर्यावरण चर का वारिस करेगा। इसी तरह शेल स्क्रिप्ट से लॉन्च किए गए प्रोग्राम के लिए।

इसलिए, लॉगिन करने पर एक शेल होता है जो प्रोफ़ाइल डेटा (जैसे ~/.profile) पढ़ता है और उन्हें लगभग सभी बच्चों, पोते और इतने पर विरासत में मिला है। यह कैसे पर्यावरण चर सेटिंग्स लॉगिन शेल या लॉगिन स्क्रिप्ट से लॉगिन सत्र के भीतर लॉन्च किए गए अन्य सभी कार्यक्रमों के लिए नीचे जाती है।

मैंने एक टर्मिनल विंडो में एक पर्यावरण चर बनाया और इसे दूसरे टर्मिनल विंडो में प्रतिध्वनित करने की कोशिश की। वह कुछ भी नहीं दिखा।

उपरोक्त स्पष्टीकरण से, यह अपेक्षित परिणाम है। एक प्रक्रिया के वातावरण में परिवर्तन इस प्रक्रिया के केवल बच्चों को प्रभावित करता है जो कि पहले से निर्मित हैं, न कि मौजूदा वाले।

$TEST=hello

यह वैसे भी काम करने की संभावना नहीं है, जब तक कि चर विस्तार अक्षम न $TESTहो या पहले से ही एक उपयुक्त मूल्य न हो। यदि आप helloचर को निर्दिष्ट करना चाहते हैं TESTतो आपको कहना होगा TEST=hello(नोट: नहीं $)।

उसके बाद मैंने इसे निर्यात किया और echoएक अलग टर्मिनल विंडो में फिर से कोशिश की । परिणाम पहले जैसा ही था।

एक बार फिर, यह अपेक्षित परिणाम है।

लेकिन अगर मैं लॉगिन पर एक ही कोड निष्पादित करता हूं (कोड को ~/.profileफाइल करने के लिए जोड़कर ) चर किसी भी टर्मिनल विंडो का उपयोग किया जा सकता है।

ऐसा इसलिए है क्योंकि टर्मिनल में शेल शेल का वंशज है जो पर्यावरण सेटिंग्स को पढ़ता है ~/.profileऔर इस प्रकार इन सेटिंग्स को विरासत में मिला है।

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