मान लीजिए कि मैं आह्वान करता हूं A=B command
और env A=B command
अंदर आता हूं bash
। क्या ऐसी कोई स्थिति है जहां दोनों के बीच अंतर हो सकता है?
मान लीजिए कि मैं आह्वान करता हूं A=B command
और env A=B command
अंदर आता हूं bash
। क्या ऐसी कोई स्थिति है जहां दोनों के बीच अंतर हो सकता है?
जवाबों:
वे उसी उद्देश्य की सेवा करते हैं (कमांड में दिए गए 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
।