एनव करने या न करने के लिए


32

आज्ञा में क्या अंतर है

$ env FOO=bar baz

तथा

$ FOO=bar baz

क्या प्रभाव पड़ता envहै?


4
एक साइड प्रश्न की तरह, लेकिन जब आप उस तरह का एक एकल सबमिशन के लिए एक पर्यावरण चर सेट करते हैं तो यह क्या विशेषता है? मुझे हमेशा इस पर जानकारी पाने में कठिन समय लगता है क्योंकि मुझे नहीं पता कि इसे क्या कहा जाता है।
जॉन क्रॉमार्टी

1
@ जॉनक्रोमार्टी, आपको एक प्रश्न के रूप में पूछना चाहिए।
cjm

1
बैश के लिए, यह यहाँ प्रलेखित है: gnu.org/software/bash/manual/...
ग्लेन जैकमैन

2
@JohnCromartie यह प्रत्येक शेल कमांड का एक वैकल्पिक घटक है, इसलिए यह अधिकांश शेल मैनुअल के "सिंपल कमांड्स" सेक्शन में है। POSIX के लिए, यह यहाँ होगा । ग्लेन ने पहले से ही आपके लिए बैश मैनुअल से एनालॉग सेक्शन को जोड़ा।
jw013

एक चर सेट करना जो एक असाइनमेंट के माध्यम से मौजूद नहीं है, एक शेल चर बनाता है। ईएनवी के माध्यम से इसे स्थापित करना या चर का निर्यात करना चर को शेल के निष्पादन वातावरण में धकेलता है। किसी मौजूदा चर का मान बदलने से निष्पादन पर्यावरण मान अपडेट हो जाएगा यदि कोई मौजूद है, अन्यथा इसे शेल आंतरिक चर में बदल दें।
जोहान

जवाबों:


26

वे कार्यात्मक रूप से समतुल्य हैं।

मुख्य अंतर यह है कि 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, और पूरी तरह से मान्य है।


1
आप FOO=bar exec bazहालांकि कर सकते हैं , इसलिए आपको envअपने अंतिम बिंदु की आवश्यकता नहीं है ।
स्टीफन चेज़लस

जब आप execकुछ करते हैं, तो क्या यह आपके वर्तमान वातावरण का उपयोग करता है?
ग्लेन जैकमैन

1
Ditto @StephaneChazelas, और आप sudo FOO=bar bazआवश्यकता के बिना पर्यावरण चर भी पास कर सकते हैं env
माइक मिलर

1
@StephaneChazelas जो केवल तभी काम करता है जब मैं FOO=barस्क्रिप्ट में रखना चाहता हूं । यदि FOOहमेशा नहीं होता है bar, तो मैं इसे कठिन कोड नहीं देना चाहता, और इसके बजाय इसे पास कर सकता हूं।
पैट्रिक

@glennjackman हाँ यह करता है, जब तक कि चर निर्यात किए जाते हैं या इससे पहले पारित किए जाते हैं exec, जैसे कि FOO=bar exec baz
पैट्रिक

14

इस विशेष उदाहरण में, कोई प्रभावी अंतर नहीं है, मान लें कि आपका शेल एक 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)था।
बरमार

6

इसके अलावा जो पहले ही कहा जा चुका है

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आप अभी भी एक पर्यावरण चर स्ट्रिंग पास नहीं कर सकते हैं जिसमें एक =(ऐसा नहीं है कि आप ऐसा करना चाहते हैं)।


2

इसका एक उपयोग शेबांग लाइनों में निष्पादनयोग्य envकी $PATHखोज करने की अनुमति देना है (क्योंकि निष्पादन योग्य की खोज envकरते $PATHसमय विचार करता है )। यह उपयोगी है यदि आप जिस निष्पादन योग्य को लागू करना चाहते हैं वह विभिन्न मशीनों पर विभिन्न स्थानों में हो सकता है। उदाहरण के लिए,

#!/usr/bin/env perl

निष्पादन योग्य बिट सेट के साथ एक स्क्रिप्ट की पहली पंक्ति में इस स्क्रिप्ट को पर्ल के साथ निष्पादित किया जाएगा, भले ही यह अंदर /usr/bin/perlया अंदर स्थापित हो/usr/local/bin/perl जब तक निर्देशिका पथ में है या एक पूरी तरह से अलग जगह में,।

बेशक, पथ खोज एक अतिरिक्त जोखिम के साथ आती है, लेकिन फिर, जोखिम उस से बड़ा नहीं है यदि आपने स्पष्ट रूप से लिखा था perl yourscript.pl, जो खोज पथ में भी गड़बड़ी दिखती है।


2

एक और समय जब 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एक गैर खाली मान पर सेट है।

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