आज्ञा में क्या अंतर है
$ 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
एक गैर खाली मान पर सेट है।