मैं के ENV_VAR=value command
लिए command
एक विशिष्ट मूल्य के साथ चलाने के लिए चला सकते हैं ENV_VAR
। क्या अनसेट के बराबर है ENV_VAR
के लिए command
?
cmd
।
मैं के ENV_VAR=value command
लिए command
एक विशिष्ट मूल्य के साथ चलाने के लिए चला सकते हैं ENV_VAR
। क्या अनसेट के बराबर है ENV_VAR
के लिए command
?
cmd
।
जवाबों:
साथ के अलावा -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
या उस एक के बजाय ) के रूप में वह काम नहीं करेगा, केवल रद्द करना होगा ।yash
typeset
local
unset
local
¹ यह भी सावधान रहें कि bash
स्थानीय ENV_VAR
(भले ही परेशान) निर्यात विशेषता को बनाए रखेगा । इसलिए यदि command
कोई ऐसा फ़ंक्शन होता है जो मान प्रदान करता है ENV_VAR
, तो चर बाद के आदेशों के वातावरण में उपलब्ध होगा। unset ENV_VAR
उस विशेषता को स्पष्ट करेगा। या आप उपयोग कर सकते हैं local +x ENV_VAR
जो एक साफ स्लेट भी सुनिश्चित करेगा (जब तक कि चर को केवल पढ़ने के लिए घोषित नहीं किया गया हो, लेकिन तब आपके बारे में ऐसा कुछ भी नहीं हो सकता है bash
)।
env '=foo' python -c 'import os; print os.environ[""]'
। मुझे उम्मीद नहीं है कि बहुत से लोग इस तरह एक चर सेट करना चाहेंगे।
जहाँ तक मेरी जानकारी है, वहाँ कोई प्रत्यक्ष समकक्ष नहीं है; आप एक सबशेल का उपयोग कर सकते हैं:
(unset ENV_VAR; exec command)
(unset ENV_VAR; exec somecommand)
यदि आप दक्षता में मूल के समतुल्य होना चाहते हैं (उपसमूह का उपभोग करके)। जैसा कि यह है, यह एक अतिरिक्त कांटा जोड़ता है।
command
उप-आह्वान के अंतिम आदेश के बाद से करते हैं।
env -u
।
आप उपयोग कर सकते हैं 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:
command
प्लेसहोल्डर्स का एक दुर्भाग्यपूर्ण विकल्प है, क्योंकि वास्तव में उस नाम से एक अंतर्निहित कमांड है।mycommand
याsomecommand
ऐसी कोई बेहतर आदत हो सकती है।