perl

2012-11-15 15 views
5

का उपयोग कर सेटअप पर्यावरण परिवर्तक मैं पर्ल का उपयोग कर पर्यावरण चर सेट करने की कोशिश कर रहा हूं। इसे सिर्फ इस स्क्रिप्ट में (वर्तमान खोल में) इस चर को निर्यात करना चाहिए।perl

मैंने कोशिश की:

`setenv X1 /p/fsd` 

system("setenv X1 /p/fsd") == 0 or die "failed:$?" 

system command "setenv X1 /p/fsd" failed: -1 

$ENV{"X1"} = "/p/fsd"; 

कुछ भी नहीं काम कर रहा है।

यदि यह महत्वपूर्ण है कि मैं टीसीएसएच का उपयोग कर रहा हूं।

+0

संभावित डुप्लिकेट [पर्ल स्क्रिप्ट के माध्यम से एक पर्यावरण चर सेट करना] (http://stackoverflow.com/questions/19192682/setting-an-environment-variable-through-a-perl-script) –

उत्तर

10
$ENV{"X1"} = "/p/fsd"; 

सही तरीका है। perlconsole में

टेस्ट:

Perl> $ENV{X1} = "/p/fsd"; 
/p/fsd 

Perl> system('echo $X1'); 
/p/fsd 
0 

नोट

  • एकल उद्धरण (या backslashing) यह अपने आप को जोड़ के perl को रोकने के लिए echo $X1 पर आवश्यक है।
  • आप माता-पिता खोल के ENV नहीं बदल सकते, देख http://www.perlmonks.org/?node_id=684685
+0

यह केवल काम करेगा जबकि स्क्रिप्ट चल रही है, है ना? एक बार स्क्रिप्ट बंद हो जाती है तो वे चले गए हैं। मैं जो करने की कोशिश कर रहा हूं वह है कि मेरे पास SHELL में 10-15 पर्यावरण चर है और वे अक्सर अपडेट होते हैं। तो मेरे बजाय उन्हें मैन्युअल रूप से सेट करने के बजाय .. मैं इसे स्क्रिप्ट करने के लिए सोच रहा था। – user1793023

+0

यह सबहेल का सिद्धांत है। अगर आप पिता को मार देते हैं, तो आप भी बेटे को मार देते हैं, यह दुखद है, लेकिन यह जीवन है। –

+0

सबशेल्स और माता-पिता के बारे में स्पष्टीकरण के लिए जोड़ा गया लिंक। –

3

क्योंकि वहाँ setenv X1 /p/fsd में कोई भी विशेष वर्ण है,

system("setenv X1 /p/fsd") 

system("setenv", "X1", "/p/fsd") 

है क्योंकि यह असफल रहने के है के बराबर है setenv नामक कोई प्रोग्राम नहीं है। यदि यह अनुकूलन मौजूद नहीं था, तो आपको एक अलग परिणाम मिलता है *। उस मामले में,

system("setenv X1 /p/fsd") 

system("sh", "-c", "setenv X1 /p/fsd") 

कि क्योंकि या तो sh कोई setenv आदेश है कार्य नहीं करेगा के बराबर होगा। तो आप इसके बजाय निम्नलिखित चला सकते हैं:

system("tcsh", "-c", "setenv X1 /p/fsd") 

लेकिन यह व्यर्थ होगा। आप एक खोल बनायेंगे, इसके चरों में से एक सेट करें। फिर खोल निकलता है और इसके चर मौजूद हैं।

आप एक env var पर्ल और उसके बच्चों द्वारा देखा सेट करना चाहते हैं, तो बस

$ENV{X1} = "/p/fsd";   # Until end of program 

या

local $ENV{X1} = "/p/fsd"; # Until end of scope 

* — अनुकूलित कोड को अलग ढंग से unoptimised से व्यवहार नहीं करना चाहिए का उपयोग कोड, लेकिन ऑप्टिमाइज़ेशन केवल उस त्रुटि को बदलता है जो आपको मिलता है, यह स्वीकार्य है।

1

जैसा कि अन्य उत्तरों का उल्लेख है, आप बच्चे से माता-पिता में पर्यावरण चर सेट नहीं कर सकते हैं। हालांकि, आप perl में कुछ जटिल कर सकते हैं और फिर अंत परिणाम को खोलने के लिए खोल में वापस कर सकते हैं।उदाहरण के लिए, tcsh में:

alias x1.pl 'eval `x1.pl`' 
+0

'ssh-agent' में एक ही समस्या है (वातावरण में वातावरण चर सेट करना कॉलिंग खोल) और उसी 'eval' चाल का उपयोग करता है। यह 'sh' और 'csh' (' -s' resp। '-c') में विभिन्न सेटनव सिंटैक्स के लिए भी स्विच करता है। –

2

भी उतना ही महत्वपूर्ण है पता करने के लिए एक env चर सेट करने के लिए कैसे,

eval `perl -le 'print q(setenv X1 /p/fsd)'` 

आप इस थोड़ा के साथ और अधिक पारदर्शी महसूस कर सकता है जैसे कि यह कैसे नष्ट करने के लिए है:

delete $ENV{"X1"}; 

यह पर्ल प्रक्रिया और किसी भी बच्चों की प्रक्रियाओं के लिए पर्यावरण चर को हटा देगा। लेकिन पर्यावरण परिवर्तक अभी भी मूल प्रक्रिया के लिए सेट किया जाएगा।

+0

यह * "एक्स 1" * या * एक्स 1 * होना चाहिए? –

+0

@ पीटर मॉर्टेंसन वे बराबर हैं। आम तौर पर, हम उद्धरण छोड़ देते हैं क्योंकि यह आसान है। खासकर पर्यावरण चर के साथ क्योंकि वे सभी टोपी हैं और कोई विशेष पात्र नहीं हैं। यह संभव है कि यदि आप अजीब विशेष पात्रों का उपयोग कर रहे हैं तो उद्धरण आवश्यक हैं। [यह चर्चा] देखें (http://stackoverflow.com/questions/401556/are-quotes-around-hash-keys-a-good-practice-in-perl) – mareoraft