एक कमांड के लिए एक पर्यावरण चर को शुरू करें


24

मैं के ENV_VAR=value commandलिए commandएक विशिष्ट मूल्य के साथ चलाने के लिए चला सकते हैं ENV_VAR। क्या अनसेट के बराबर है ENV_VARके लिए command?


7
एक तरफ: commandप्लेसहोल्डर्स का एक दुर्भाग्यपूर्ण विकल्प है, क्योंकि वास्तव में उस नाम से एक अंतर्निहित कमांड है। mycommandया somecommandऐसी कोई बेहतर आदत हो सकती है।
चार्ल्स डफी

@CharlesDuffy, मैं आमतौर पर उसके लिए उपयोग करता हूं cmd
स्टीफन चेज़लस

जवाबों:


35

साथ के अलावा -iविकल्प है, जो पूरे वातावरण मिट जाता है, POSIX envएक चर अनसेट करने के लिए किसी भी तरह से प्रदान नहीं करता है।

हालांकि, कुछ envकार्यान्वयन (GNU's, busybox'और FreeBSD के कम से कम) के साथ, आप कर सकते हैं:

env -u ENV_VAR command

जो ENV_VARपर्यावरण से एक चर के प्रत्येक उदाहरण को हटाने पर काम करेगा (ध्यान दें कि यह खाली नाम के साथ पर्यावरण चर के लिए काम नहीं करता है ( env -u ''या तो एक त्रुटि देता है या कार्यान्वयन के आधार पर अप्रभावी है, भले ही सभी स्वीकार करते हैं env '=value', शायद एक सीमा unsetenv()C फ़ंक्शन द्वारा किए गए जो POSIX को खाली स्ट्रिंग के लिए एक त्रुटि वापस करने की आवश्यकता है, जबकि इसके लिए कोई सीमा नहीं है putenv()))।

आंशिक रूप से (POSIX गोले में), आप कर सकते हैं:

(unset -v ENV_VAR; exec command)

(ध्यान दें कि कुछ गोले के साथ, का उपयोग करके execपरिवर्तन किया जा सकता है जो commandचलाया जाता है: उदाहरण के लिए फ़ंक्शन या बिलिन के बजाय फाइलसिस्टम में एक चलाता है (और aliasस्पष्ट रूप से विस्तार को बायपास करेगा ), envऊपर की तरह । आप उन मामलों में इसे छोड़ना चाहते हैं) ।

लेकिन यह पर्यावरण चर के लिए काम नहीं करेगा, जिसमें एक ऐसा नाम है जो शेल चर के लिए मैप करने योग्य नहीं है (ध्यान दें कि कुछ गोले जैसे mkshपर्यावरण पर उन चर को स्टार्टअप पर वैसे भी बंद कर देंगे), या चर जो केवल पढ़ने के लिए चिह्नित किए गए हैं।

-vबॉर्न शेल के लिए है और bashजिसके unsetबिना -vकोई ENV_VAR फ़ंक्शन अनसेट कर सकता है यदि उस नाम से कोई चर नहीं था । जब तक आप -fविकल्प पास नहीं करेंगे तब तक अधिकांश अन्य गोले फंक्शन को अनसेट नहीं करेंगे । (अभ्यास में अंतर करने की संभावना नहीं है)।

(इसके अलावा के बग / misfeature से सावधान bash/ mksh/ yashजिसका unset, के तहत कुछ परिस्थितियों चर अनसेट नहीं है, लेकिन एक बाहरी दायरे में चर प्रकट )

यदि perlउपलब्ध है, तो आप कर सकते हैं:

perl -e 'delete $ENV{shift@ARGV}; exec @ARGV or die$!' ENV_VAR command

जो खाली नाम के साथ पर्यावरण चर के लिए भी काम करेगा।

अब वे सभी काम नहीं करेंगे यदि आप एक बिलियन या फ़ंक्शन के लिए एक पर्यावरण चर बदलना चाहते हैं और उन्हें उप-क्रम में चलाना नहीं चाहते हैं, जैसे bash:

env -u LANG printf -v var %.3f 1.2 # would run /usr/bin/printf instead
(unset -v LANG; printf -v var %.3f 1.2) # changes to $var lost afterwards

(यह सुनिश्चित करने पर कि गलत दृष्टिकोण के रूप में LANG को परेशान .करना दशमलव विभाजक के रूप में उपयोग और समझा जाता है। इसके लिए उपयोग करना बेहतर होगा LC_ALL=C printf...)

कुछ गोले के साथ, आप किसी फ़ंक्शन का उपयोग करके चर के लिए एक स्थानीय गुंजाइश बना सकते हैं:

without() {
  local "$1" # $1 variable declared as initially unset in bash¹
  shift
  "$@"
}
without LANG printf -v var %.3f 1.2

इसके साथ zsh, आप एक अनाम फ़ंक्शन का भी उपयोग कर सकते हैं:

(){local ENV_VAR; command}

यह दृष्टिकोण कुछ गोले में काम नहीं करेगा (जैसे कि अल्मक्विस्ट शेल पर आधारित), जो शुरू में localपरेशान (लेकिन मूल्य और विशेषताओं के वारिस के रूप में) चर घोषित नहीं करते हैं। उन में, आप कर सकते हैं local ENV_VAR; unset ENV_VAR, लेकिन ऐसा नहीं करते ( mkshया उस एक के बजाय ) के रूप में वह काम नहीं करेगा, केवल रद्द करना होगा ।yashtypesetlocalunsetlocal

¹ यह भी सावधान रहें कि bashस्थानीय ENV_VAR(भले ही परेशान) निर्यात विशेषता को बनाए रखेगा । इसलिए यदि commandकोई ऐसा फ़ंक्शन होता है जो मान प्रदान करता है ENV_VAR, तो चर बाद के आदेशों के वातावरण में उपलब्ध होगा। unset ENV_VARउस विशेषता को स्पष्ट करेगा। या आप उपयोग कर सकते हैं local +x ENV_VARजो एक साफ स्लेट भी सुनिश्चित करेगा (जब तक कि चर को केवल पढ़ने के लिए घोषित नहीं किया गया हो, लेकिन तब आपके बारे में ऐसा कुछ भी नहीं हो सकता है bash)।


1
यह एक अलग सवाल है, लेकिन क्या बिल्ली एक खाली नाम के साथ एक पर्यावरण चर है और आप कभी इसका उपयोग कैसे करेंगे - यहां तक ​​कि किसी प्रकार के शोषण के लिए भी? क्या आपको ऐसा प्रोग्राम नहीं लिखना होगा जो पर्यावरण को पढ़ता हो और विशेष रूप से कुछ ऐसा दिखता हो?
जो

@ जो, उदाहरण के लिए प्रयास करें env '=foo' python -c 'import os; print os.environ[""]'। मुझे उम्मीद नहीं है कि बहुत से लोग इस तरह एक चर सेट करना चाहेंगे।
स्टीफन चेज़लस

9

जहाँ तक मेरी जानकारी है, वहाँ कोई प्रत्यक्ष समकक्ष नहीं है; आप एक सबशेल का उपयोग कर सकते हैं:

(unset ENV_VAR; exec command)

(unset ENV_VAR; exec somecommand)यदि आप दक्षता में मूल के समतुल्य होना चाहते हैं (उपसमूह का उपभोग करके)। जैसा कि यह है, यह एक अतिरिक्त कांटा जोड़ता है।
चार्ल्स डफी

1
@Charles वास्तव में, हालांकि कुछ गोले स्वचालित रूप से commandउप-आह्वान के अंतिम आदेश के बाद से करते हैं।
स्टीफन किट

+1 क्योंकि यह तरीका इंटरैक्टिव उपयोग के लिए टाइप करने के लिए सरल है। मैं शेल-वातावरण में एक-लाइनर के लिए एक-लाइन परिवर्तन के लिए उप-भाग का उपयोग करता हूं यह याद रखने के बजाय env -u
पीटर कॉर्डेस

0

आप उपयोग कर सकते हैं ENV_VAR= command

यह वास्तव में चर को परेशान नहीं करता है, लेकिन यह कई मामलों में उपयोगी हो सकता है (शेल स्क्रिप्ट आमतौर पर test -nयह जांचने के लिए उपयोग करते हैं कि क्या चर सेट है):

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