`env <कमांड>` क्या कर रहा है?


37

कमांड env ls -alक्या कर रहा है?

मेरे पास एक लिनक्स टेस्ट था और सवाल था: "कमांड को सीधे कैसे चलाना है, लेकिन इसका उपनाम नहीं?"
मुझे पता था कि कुछ विशेष प्रतीक के साथ उपसर्ग कमांड जैसे समाधान मौजूद हैं, लेकिन मैं इसे भूल गया। अब मुझे पता है कि यह है \। ( इस पोस्ट से पढ़ें )।

लेकिन मुझे यह भी याद है कि कहीं मैंने पढ़ा कि उर्फ ​​से छुटकारा पाने के लिए हम एक कमांड के साथ उपसर्ग कर सकते हैं env। मैंने इसे किया और यह काम करता है, लेकिन मेरा जवाब गलत था। मैं पढ़ा infoऔर manपर env, लेकिन बहुत ज्यादा समझ में नहीं आया।

क्या envकर रहा है और वास्तव में खुद के env <command>लिए किसी भी तर्क के बिना env?


एक नोट, इस है कि मैं कर रहे हैं के बारे में सोच सकते हैं करने के 3 तरीके के रूप में env <command>, command <command>है, और \<command>। मेरी राय में, यदि कुछ परीक्षण env <command>अवैध हैं, तो वह परीक्षण टूट गया है।
पैट्रिक

@Patrick: यह इसलिए नहीं टूटा क्योंकि क्रिस ने कहा, पर एक स्वीकार्य हो सकता है commandया envजो केवल स्वीकार्य उत्तर देगा।
पियरे अरलाउड

1
@ArlaudPierre और `\` को पॉज़िक्स में परिभाषित नहीं किया गया है (उर्फ भागने के रूप में), इसलिए यह पोर्टेबल नहीं है। इसलिए यह दूसरों की तुलना में अधिक स्वीकार्य नहीं है।
पैट्रिक

@ पैट्रिक: सच, सच। अब हमें यह कहने के लिए परीक्षण की सटीक परिधि को जानना होगा। लेकिन किसी भी मामले में, यह पता लगाएं कि "env" उत्तर स्वीकार्य नहीं है, बहुत ईमानदार नहीं है, मुझे उस पर आपसे सहमत होना होगा।
पियरे अरलाउड

दोस्तों, परीक्षण मानव द्वारा भी सत्यापित किया गया था (एलपीआई-प्रमाणित पूर्व-सिसडमिन, जो अब दूसरों को लिनक्स सिखा रहा है) :) मैंने सत्यापनकर्ता से शिकायत की, गया manऔर समझ में नहीं आया कि envवास्तव में क्या कर रहा है। इस पोस्ट के बाद - यह स्पष्ट है और मेरे उत्तर की समीक्षा की गई (स्वीकृत)। सभी को धन्यवाद!
ALZ

जवाबों:


38

यह आज्ञा

env name=value name2=value2 program and args

आदेश चलाता है program and argsएक वातावरण वातावरण चर और मूल्यों द्वारा नामित के साथ वर्तमान वातावरण का विस्तार करके गठन के साथ name=valueऔर name2=value2। यदि आप किसी भी तर्क को शामिल नहीं करते हैं name=value, तो वर्तमान वातावरण को अनमॉडिफाइड कर दिया जाता है।

उपनामों के संबंध में मुख्य बात यह है कि env एक बाहरी कमांड है, इसलिए इसे उपनामों का कोई "ज्ञान" नहीं है: उपनाम एक शेल निर्माण है जो सामान्य प्रक्रिया मॉडल का हिस्सा नहीं है और उन कार्यक्रमों पर कोई प्रभाव नहीं पड़ता है जो सीधे होते हैं गैर-शेल प्रोग्राम (जैसे एनवी ) द्वारा चलाया जाता है । env बस program and argumentsएक निष्पादक कॉल को पास करता है (जैसे execvp , जो PATH को खोजेगा program)।

मूल रूप से, इस तरह से env का उपयोग करना उपनाम (शेल), शेल फ़ंक्शन, शेल बिलिन कमांड, और शेल कार्यक्षमता के किसी भी अन्य बिट्स से बचने का एक स्वतंत्र तरीका है, जो कमांड-पोजिशन आर्ग्युमेंट्स (यानी प्रोग्राम नाम) को प्रतिस्थापित या ओवरराइड कर सकता है, - बेशक, envएक उपनाम, या शेल फ़ंक्शन है! यदि आप envएक उपनाम होने के बारे में चिंतित हैं , तो आप पूरा रास्ता निकाल सकते हैं (जैसे /usr/bin/env, हालांकि यह भिन्न हो सकता है)।


24

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

उदाहरण के लिए, एक बाश स्क्रिप्ट की शुरुआत #!/bin/bashठीक है, जबकि हर उचित प्रणाली पर शामिल #!bashहोने के बावजूद नहीं है।/binPATH

मुझे अक्सर पायथन कार्यक्रमों में इसका सामना करना पड़ता है, जो आमतौर पर निष्पादन योग्य (नोट #!/usr/bin/env pythonके पूर्ण, सिस्टम-निर्भर पथ को निर्दिष्ट करने से बचने के लिए शुरू होता है python, हालांकि, यह अभी भी आवश्यकता है कि इसमें envरहता है /usr/bin, लेकिन यह अजगर के स्थान से कहीं अधिक सामान्य है) बाइनरी)।

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