आज्ञा में क्या अंतर है
$ env FOO=bar baz
तथा
$ FOO=bar baz
क्या प्रभाव पड़ता envहै?
आज्ञा में क्या अंतर है
$ env FOO=bar baz
तथा
$ FOO=bar baz
क्या प्रभाव पड़ता envहै?
जवाबों:
वे कार्यात्मक रूप से समतुल्य हैं।
मुख्य अंतर यह है कि env FOO=bar baz शेल के बीच एक मध्यस्थ प्रक्रिया को शामिल करना शामिल है और baz, जहां FOO=bar bazशेल सीधे आक्रमण करता है baz।
तो उस संबंध में, FOO=bar bazपसंद किया जाता है।
केवल वही स्थितियाँ जो मैं स्वयं का उपयोग कर पाता हूँ env FOO=bar, जहाँ मुझे एक कमांड को दूसरे कमांड में पास करना होता है।
एक विशिष्ट उदाहरण के रूप में, मैं कहता हूं कि मेरे पास एक रैपर स्क्रिप्ट है जो पर्यावरण के कुछ संशोधनों को निष्पादित करती है, और फिर execउस कमांड पर कॉल करती है जिसे इसे पारित किया गया था, जैसे:
#!/bin/bash
FOO=bob
some stuff
exec "$@"
यदि आप इसे निष्पादित करते हैं myscript FOO=bar baz, तो अमान्य के execरूप exec FOO=bar bazमें एक त्रुटि फेंक देंगे ।
इसके बजाय आप इसे कहते हैं myscript env FOO=bar bazजो कि निष्पादित होता है exec env FOO=bar baz, और पूरी तरह से मान्य है।
FOO=bar exec bazहालांकि कर सकते हैं , इसलिए आपको envअपने अंतिम बिंदु की आवश्यकता नहीं है ।
execकुछ करते हैं, तो क्या यह आपके वर्तमान वातावरण का उपयोग करता है?
sudo FOO=bar bazआवश्यकता के बिना पर्यावरण चर भी पास कर सकते हैं env।
FOO=barस्क्रिप्ट में रखना चाहता हूं । यदि FOOहमेशा नहीं होता है bar, तो मैं इसे कठिन कोड नहीं देना चाहता, और इसके बजाय इसे पास कर सकता हूं।
exec, जैसे कि FOO=bar exec baz।
इस विशेष उदाहरण में, कोई प्रभावी अंतर नहीं है, मान लें कि आपका शेल एक POSIX- संगत शेल है, और मान bazलेना एक निष्पादन योग्य है और शेल शेल नहीं है।
अपने खोल है नहीं एक POSIX संगत खोल, उदाहरण के लिए cshया tcsh, वाक्य रचना
FOO=bar baz
काम नहीं करता है, और कोई समान शेल सिंटैक्स नहीं है। उन गोले के लिए,env कमांड एकल कमांड के लिए पर्यावरण चर को ओवरराइड या इंजेक्ट करने का एकमात्र तरीका है।
यदि bazएक शेल बिल्डिन है, तो fcउदाहरण के लिए कहें , तो envवही परिणाम नहीं देगा, क्योंकि envकमांड शेल द्वारा सीधे चलाने के बजाय एक नई प्रक्रिया को निष्पादित कर रहा है। इसके अलावा, कोई fcनिष्पादन योग्य नहीं है , इसे केवल शेल बिलिन के रूप में चलाया जा सकता है क्योंकि यह शेल पर्यावरण के साथ इंटरैक्ट करता है, और इसलिए कभी भी बिलिन के साथ काम नहींenv करेगा ।fc
इसके अलावा, विकल्प envप्रदान करता -iहै, जो आपको खाली वातावरण में केवल एक निर्दिष्ट वातावरण परिवेश के साथ कमांड शुरू करने की अनुमति देता है। तो envउदाहरण के लिए, स्वच्छ वातावरण में प्रक्रियाओं शुरू करने के लिए बहुत उपयोगी हो सकता है
env -i HOME=/tmp/homedir "PATH=`getconf PATH`" "TERM=$TERM" FOO=bar baz
tcshलिखता (setenv FOO bar; baz)था।
इसके अलावा जो पहले ही कहा जा चुका है
VAR=value cmd args > redirs
एक शेल (बॉर्न / POSIX) सुविधा होने के नाते, आप अपने द्वारा चलाए जा रहे पर्यावरण चर के नाम पर सीमित हैं cmd। उन्हें मान्य शेल चर नाम होना चाहिए और शेल में केवल-पढ़ने के लिए या विशेष चर नहीं होना चाहिए।
उदाहरण के लिए, आप ऐसा नहीं कर सकते:
1=foo cmd
या
+++=bar cmd
bash आपको ऐसा करने की अनुमति नहीं देता है:
SHELLOPTS=xtrace cmd
जब आप कर सकते हैं:
env 1=foo cmd
env +++=bar cmd
env '=baz' cmd
(ऐसा नहीं है कि आप चाहते हैं या ऐसा करना चाहिए)। या:
env SHELLOPTS=xtrace cmd
(मुझे कभी-कभी ऐसा करने की आवश्यकता होती है)।
ध्यान दें कि envआप अभी भी एक पर्यावरण चर स्ट्रिंग पास नहीं कर सकते हैं जिसमें एक =(ऐसा नहीं है कि आप ऐसा करना चाहते हैं)।
इसका एक उपयोग शेबांग लाइनों में निष्पादनयोग्य envकी $PATHखोज करने की अनुमति देना है (क्योंकि निष्पादन योग्य की खोज envकरते $PATHसमय विचार करता है )। यह उपयोगी है यदि आप जिस निष्पादन योग्य को लागू करना चाहते हैं वह विभिन्न मशीनों पर विभिन्न स्थानों में हो सकता है। उदाहरण के लिए,
#!/usr/bin/env perl
निष्पादन योग्य बिट सेट के साथ एक स्क्रिप्ट की पहली पंक्ति में इस स्क्रिप्ट को पर्ल के साथ निष्पादित किया जाएगा, भले ही यह अंदर /usr/bin/perlया अंदर स्थापित हो/usr/local/bin/perl जब तक निर्देशिका पथ में है या एक पूरी तरह से अलग जगह में,।
बेशक, पथ खोज एक अतिरिक्त जोखिम के साथ आती है, लेकिन फिर, जोखिम उस से बड़ा नहीं है यदि आपने स्पष्ट रूप से लिखा था perl yourscript.pl, जो खोज पथ में भी गड़बड़ी दिखती है।
एक और समय जब envवास्तव में उपयोगी है यदि आप पर्यावरण को पूरी तरह से नियंत्रित करना चाहते हैं। मैं एक सर्वर प्रोग्राम (Informix, यदि आप अनुमान नहीं लगा सकते हैं) चलाते हैं जिसका वातावरण मैं पूरी तरह से नियंत्रित करना चाहता हूं। मैं इसे envएक स्क्रिप्ट के अंत में उपयोग करता हूं जो सही मानों के लिए चर का एक समूह सेट करता है:
env -i HOME="$IXD" \
INFORMIXDIR="$IXD" \
INFORMIXSERVER="$IXS" \
${IXC:+INFORMIXCONCSMCFG="$IXC"} \
${IXH:+INFORMIXSQLHOSTS="$IXH"} \
IFX_LISTEN_TIMEOUT=3 \
ONCONFIG="onconfig.$IXS" \
PATH="/bin:/usr/bin:$IXD/bin" \
SHELL=/bin/ksh \
TZ=UTC0 \
$ONINIT "$@"
-iविकल्प मौजूदा वातावरण zaps। बाद के VAR=valueविकल्प पर्यावरण चर सेट करते हैं जिन्हें मैं सेट करना चाहता हूं; कार्यक्रम का नाम है $ONINIT, और किसी भी कमांड लाइन तर्क के साथ शब्दशः के माध्यम से पारित कर रहे हैं "$@"।
${IXH:+INFORMIXSQLHOSTS="$IXH"}निर्माण केवल गुजरता है INFORMIXSQLHOSTS="$IXH"करने के लिए envकरता है, तो $IXHएक गैर खाली मान पर सेट है।