2009-04-18 21 views
12

पर कोई आदेश मौजूद है या नहीं, मैं यह बताने में सक्षम होना चाहता हूं कि किसी शेल स्क्रिप्ट से किसी भी POSIX सिस्टम पर कोई आदेश मौजूद है या नहीं।पता लगाएं कि POSIX सिस्टम

लिनक्स पर, मैं निम्नलिखित कर सकते हैं:

if which <command>; then 
    ...snip... 
fi 

हालांकि, सोलारिस और MacOS which एक निकास विफलता कोड जब आदेश मौजूद नहीं है देना नहीं है, वे तो बस STDOUT करने के लिए एक त्रुटि संदेश मुद्रित करें।

इसके अलावा, मैं हाल ही में पता चला कि which आदेश ही POSIX (http://www.opengroup.org/onlinepubs/009695399/utilities/ देखें)

कोई भी विचार नहीं है?

+2

संबंधित: [खोल - जांचें कि कोई प्रोग्राम बैश स्क्रिप्ट से मौजूद है या नहीं) (http://stackoverflow.com/questions/592620/check-if-a-program-exists-from-a-bash-script) – mrak

+0

धन्यवाद, नीचे से इतना स्पष्ट नहीं था, इससे मुझे @mrak 'if command -v ड्रॉपबॉक्स में मदद मिली; तो ड्रॉपबॉक्स चल रहा है '... – Louis

उत्तर

18

command -v एक पॉज़िक्स निर्दिष्ट कमांड है जो करता है जो करता है।

इसे वापस करने के लिए परिभाषित किया गया है> 0 जब आदेश नहीं मिला है या कोई त्रुटि उत्पन्न होती है।

+2

मैं कमांड उपलब्धता की जांच के लिए, 'command -v' का उपयोग करने के साथ 100% सहमत हूं, मैं इसे हर समय उपयोग करता हूं। उदाहरण के लिए, 'कमांड-वी सीएमडी>/dev/null || गूंज 'सीएमडी नहीं मिला' 'कोई बेवकूफ' अगर आवश्यक है !! – TechZilla

+2

@ टेक ज़िला: 'if' कथन बेवकूफ क्यों हैं? – dokaspar

+0

'if' बेवकूफ नहीं है क्योंकि यह' if' है, यह इस उपयोग के मामले में बेवकूफ था क्योंकि यह अपरिपक्व है। कोई समूह नहीं था, और इस प्रकार कोई अतिरिक्त अर्थपूर्ण मूल्य नहीं था, यह केवल एक अनावश्यक पुनर्मूल्यांकन होगा। वैसे भी इसे उचित ठहराया जा सकता है! किसी भी अभ्यास का उत्साह लगभग कुछ भी उचित ठहरा सकता है, और इस मामले में परिणाम महत्वहीन है ... लेकिन इसका मतलब यह नहीं है कि वे सही हैं, या सभी चीजें बराबर हैं। आम तौर पर मैं इस तरह का अभ्यास करता हूं, एक कमांड कोड (परीक्षण शामिल) एक त्रुटि कोड के साथ, अगर कोई कथन नहीं है। एक बार जब आप अधिक प्राप्त कर लेंगे, तो 'if' उचित से अधिक हो सकता है। – TechZilla

0

आप निकास कोड की जांच करने के बजाय एक चर या एक सरणी (बैकटिक्स का उपयोग करके) में "जो" के stdout/stderr को पढ़ सकते हैं।

यदि सिस्टम में "कौन" या "कहां" कमांड नहीं है, तो आप $ PATH चर की सामग्री भी ले सकते हैं, फिर सभी निर्देशिकाओं पर लूप और दिए गए निष्पादन योग्य की खोज कर सकते हैं। यह अनिवार्य रूप से जो करता है (हालांकि यह $ PATH परिणामों के कुछ कैशिंग/अनुकूलन का उपयोग कर सकता है)।

+0

समस्या यह है कि यहां तक ​​कि उन प्रणालियों पर भी * जिनके पास * है, मैं गारेन नहीं किया गया हूं, यहां तक ​​कि * आउटपुट भी होगा ... मुझे लगता है कि मैं यह देखने के लिए जांच सकता हूं कि यह नहीं है "पथ की तरह दिखें" ... – singpolyma

+0

आह, [-x "' जो एईआई '"] काम कर सकता है ... फिर, मान लेता है कि कौन सा मौजूद है ... – singpolyma

2

POSIX कहते हैं, "If a command is not found, the exit status shall be 127." तो तुम

<command> 
if [ "${?}" = 127 ]; then 
    <handle not found> 
fi 

कर सकता है जब शेल स्क्रिप्ट लेखन, यह अक्सर अनुमति, एक bash खोल (#!/bin/bash) की आवश्यकता होती है, क्योंकि सरणियों के बिना यह काफी असंभव तर्क को संभालने के लिए है करता है और/या रिक्त स्थान के साथ फ़ाइल नाम सही ढंग से। उस स्थिति में, type -p बिशिन बनाया गया है जिसके बराबर है, और क्योंकि यह निर्मित है, यह पोर्टेबल है।

+2

बिना टाइप के पीओएसआईक्स है, लेकिन पॉज़िक्स यह गारंटी नहीं देता है कि यह एक त्रुटि के रूप में मौजूद कमांड का अर्थ नहीं है। – singpolyma

+1

बैश कई प्रणालियों पर एक अतिरिक्त है। यह पता लगाने की कोशिश कर रहा है कि गैर-मानक खोल का उपयोग करके चीजें समर्थित हैं या नहीं, यह बहुत अच्छा नहीं है। – dwc

+2

उबंटू पर, उन्होंने जितनी संभव हो उतनी स्क्रिप्ट के लिए बैश से डैश में स्विच करने की कोशिश की है (विशेष रूप से स्टार्टअप के दौरान) क्योंकि यह लॉन्च करने के लिए छोटा और तेज़ है। और बीएसडी अपने बेस इंस्टॉल में बैश के साथ जहाज नहीं भेजते हैं। न ही अधिकांश सिस्टम वी आधारित यूनिक्स। –

संबंधित मुद्दे