क्या नाम-मूल्य-जोड़ी को कमांड में रखने और बाश में env का उपयोग करने के बीच अंतर है?


19

मान लीजिए कि मैं आह्वान करता हूं A=B commandऔर env A=B commandअंदर आता हूं bash। क्या ऐसी कोई स्थिति है जहां दोनों के बीच अंतर हो सकता है?

जवाबों:


26

वे उसी उद्देश्य की सेवा करते हैं (कमांड में दिए गए env var को पास करते हैं)। हालांकि कुछ उल्लेखनीय अंतर:

A=B command

एक खोल (बॉर्न / POSIX / आरसी) निर्माण है।

उदाहरण के लिए, आप कर सकते हैं:

A=B find . -exec cmd '{}' +

या:

find . -exec env A=B cmd '{}' +

लेकिन आप ऐसा नहीं कर सकते:

find . -exec A=B cmd '{}' +

क्योंकि findउस आदेश को चलाने के लिए एक शेल का आह्वान नहीं किया गया है।

दूसरी ओर, envएक बाहरी कमांड होने के नाते, आप ऐसा नहीं कर सकते:

f() { ...; }
env A=B f

या:

env A=B eval '...'

इसके अलावा:

A=B cmd

केवल env var के साथ काम करता है जो मान्य शेल चर नाम हैं। आपको envकिसी अन्य env var नाम की आवश्यकता है:

env 'my var=foo' cmd...

bash_चर को रीसेट करता है :

bash-4.3$ _=xxx env | grep '^_='
_=/usr/bin/env
bash-4.3$ env _=xxx env | grep '^_='
_=xxx

उस संदर्भ में zsh, ARGV0और STTYविशेष अर्थ:

STTY=-echo cat

catटर्मिनल echoअक्षम के साथ चलता है । तथा:

ARGV0=foo cmd

चलाता है cmdके साथ fooअपने रूप में argv[0]

यदि आप वह विशेष प्रसंस्करण नहीं चाहते हैं, तो आपको उपयोग करना होगा env

ध्यान दें कि sudoसमर्थन करता है:

sudo A=B cmd

यह शेल का उपयोग या envऐसा करने के लिए नहीं है। यह वह खुद ही करता है।

यह किसी भी नाम के साथ वेरिएबल्स को पास कर सकता है -

असाइनमेंट एक शेल निर्माण है जबकि तर्क में एक समान चिह्न envका शेल के लिए कोई विशेष अर्थ नहीं है, इसलिए A=$B cmdसुरक्षित है जबकि env A="$B" cmd(या sudo A="$B" cmd) डबल उद्धरण हैं।

A=B cmdवाक्य रचना केवल बॉर्न और के गोले में समर्थित है rcपरिवारों (नहीं esहै)। उदाहरण के लिए cshया fishपरिवारों के गोले में , आपको सहारा लेना होगा env

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