मान लीजिए कि मैं आह्वान करता हूं 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।