जल्लाद के आदेश पर रोक लग गई


14

यदि मैं testकमांड को बैश में निष्पादित करता हूं , test(सशर्त अभिव्यक्ति का मूल्यांकन करता है) अंतर्निहित उपयोगिता शुरू की जाती है:

$ type test
test is a shell builtin
$ type -a test
test is a shell builtin
test is /usr/local/bin/test
test is /usr/bin/test
$ 

हालाँकि, जैसा कि type -a testऊपर के आउटपुट में देखा गया है, एक testऔर / usr / स्थानीय / बिन निर्देशिका में है और एक अन्य / usr / बिन निर्देशिका में है। कैसे निष्पादन योग्य आदेश दिए जाते हैं, यानी अंतर्निहित कमांड हमेशा पसंद किए जाते हैं और फिर बाकी आदेश $ PATA चर में निर्देशिका के आदेश पर निर्भर करते हैं? इसके अलावा, क्या निष्पादित निष्पादन के क्रम को बदलना संभव है, जैसे यदि मैं टाइप करता हूं test, तो बैश-बिलिन के बजाय / usr / bin / परीक्षण शुरू किया जाता है test?


आप कमांड को कॉल करते समय पूर्ण पथ निर्दिष्ट कर सकते हैं, उदाहरण के लिए, /usr/bin/test -f "$file"...
jasonwryan

@jasonwryan मैं इससे अवगत हूं, लेकिन यदि निष्पादक के क्रम को बदलने का कोई तरीका है, तो मुझे बस दिलचस्पी है।
मार्टिन

जवाबों:


25

सर्वोच्च प्राथमिकता है बैश उर्फ, फिर स्पेशल बिलिंस (केवल POSIX मोड में), फिर फ़ंक्शंस, फिर बिलिन्स, फिर एक खोज $PATH

एक बिलिन को निष्पादित करने के लिए, का उपयोग करें builtin test
किसी बाहरी एप्लिकेशन को निष्पादित करने के लिए, एक स्पष्ट पथ का उपयोग करें /bin/test:।
कार्यों और उपनामों को अनदेखा करने के लिए, उपयोग करें command test
बस उपनाम, उपयोग \testया किसी अन्य प्रकार के विस्तार को बायपास करने के लिए ।

इसके साथ एक बेसिन को निष्क्रिय / सक्षम करना संभव है enable test

(नीचे दी गई टिप्पणियों के अनुसार अपडेट किया गया)
(फिक्स्ड गलत एडमिन संपादित करें कि बैश ने disableबिलिन बनाया है - वास्तव में, केवल है enable)


1
@ 1_CR gena2x सही है। मेरे उत्तर ने विशेष बिल्डरों को छोड़ दिया, जो POSIX के अनुसार कार्यों पर पूर्वता बरतते हैं (हालांकि कुछ गोले अनुपालन योग्य नहीं होते हैं; केवल पॉश मोड में बैश अनुपालन करते हैं)।
गिल्स एसओ- बुराई को रोकें '29

1
सुझाए गए संपादित करें: जब आप आदेश (या इसके किसी भी भाग) बोली उपनाम अक्षम हैं, के रूप में \testया 'test'या tes't'
जॉन कुगेलमैन

2
वह पूरी तस्वीर नहीं है। किसी भी तरह के विस्तार (बैश मैनुअल में, सभी प्रतिस्थापन, टिल्ड विस्तार और तथाकथित विस्तार पर ) लगता है कि एलियास को निष्क्रिय कर देता है। मैंने कोशिश की।
gena2x

1
बैश आदमी पृष्ठ से उद्धरण:।। "प्रत्येक साधारण आदेश का पहला शब्द, गैर उद्धृत करता है, तो, अगर यह एक उपनाम है देखने के लिए जाँच की जाती है यदि हां, तो उस शब्द उर्फ के पाठ की जगह वर्ण /, $, बैकटिक, और =और ऊपर सूचीबद्ध किसी भी शेल मेटाचैक्टर या उद्धृत वर्ण किसी अन्य नाम में प्रकट नहीं हो सकते हैं। "
जॉन कुगेलमैन

2
+1 इस जानकारी के स्रोत को खोजने में मेरी मदद करने के संकेत के लिए: यह खंड मैन पेज में है, अनुभाग COMMECUTION, दूसरे और तीसरे पैराग्राफ के तहत।
ट्वैन 163

6

अंतर्निहित कमांड हमेशा बाहरी कमांड के लिए पसंद की जाती हैं। औचित्य यह है कि अंतर्निहित कमांड तेज है (और कुछ मामलों में, जैसे cdया , केवल अंतर्निहित कमांड का वांछित प्रभाव हो सकता है)।test -o BASH_OPTION

कभी-कभी बाहरी कमांड में ऐसी क्षमताएं हो सकती हैं जो शेल बिल्ट नहीं करती हैं। उस स्थिति में, आप एक स्पष्ट रास्ता (यानी एक स्लैश युक्त) देकर बाहरी कमांड को कॉल कर सकते हैं (यह आदेश के बारे में किसी भी चिंता को दरकिनार कर देता है $PATH)। यदि आप बाहरी पथ को हार्ड-कोड नहीं करना चाहते हैं, लेकिन आप बिलिन के उपयोग को रोकना चाहते हैं, तो आप bash में, ksh और zsh में "$(type -P test)"(नोट कैपिटल P) का उपयोग कर सकते हैं । बाहरी कमांड के उपयोग के लिए बाध्य करने का दूसरा तरीका बिलिन ( ) का उपयोग करना या उपयोगिता ( ) से गुजरना है ।"$(whence -p test)"=testcommandcommand -p test …envenv test …

Zsh में, आप एक बेसिन को निष्क्रिय कर सकते हैं disable test। यह स्थायी है (वर्तमान शेल या उपधारा के लिए) जब तक कि बिलिन के साथ फिर से जुड़ नहीं जाता है enable test। बैश में, आप इसे enable -n testअक्षम करने और enable testपुन: प्रयोज्य करने के लिए कर सकते हैं ।

उदाहरण के लिए alias test=/usr/bin/testया किसी अन्य आदेश के निष्पादन के लिए बाध्य करने के लिए आप किसी अन्य नाम या फ़ंक्शन का उपयोग कर सकते हैं test () { /usr/bin/test "$@"; }। यदि आपके पास ऐसा कोई उपनाम है, तो आप इसके किसी भी भाग को उद्धृत करके इसके उपयोग को रोक सकते हैं, उदाहरण के \testलिए सामान्य फ़ंक्शन / बिल्डिन / बाहरी लुकअप करेंगे। ध्यान दें कि शेल और उसकी सेटिंग्स के आधार पर, किसी फ़ंक्शन में उर्फ ​​परिभाषा का विस्तार तब किया जा सकता है जब कोई फ़ंक्शन पढ़ा जाता है या जब इसे निष्पादित किया जाता है। यदि आपने कोई फ़ंक्शन परिभाषित किया है, तो आप command testफ़ंक्शन लुकअप के साथ-साथ अन्य लुकअप को रोकने के लिए उपयोग कर सकते हैं (इसलिए यहां testबिलिन को अक्षम होने तक लागू किया जाएगा)।


envयहां भी उचित नहीं होगा?
स्टीवन पेनी

इसलिए, यदि शेल बिजीबॉक्स से चलता है, तो अन्य, आमतौर पर एक्सटर्नल के रूप में माने जाने वाले एक ही बिजीबॉक्स से बाहरी कमांड हैं? उदाहरण के लिए, मैंने dfपहले स्थान पर एक PATH में पूर्ण जोड़ा , उर्फ ​​'df', which dfशो / ऑप्ट / बिन / df को हटा दिया , लेकिन df रन / बिन / df -> बिजीबॉक्स
पापो

@papo which dfजरूरी नहीं कि आपको क्या दिखाए dfunix.stackexchange.com/questions/85249/…
गाइल्स '
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.