पता लगाने का सबसे अच्छा तरीका क्या है (एक स्क्रिप्ट से) क्या सॉफ्टवेयर स्थापित है?


9

मैं whichविभिन्न प्लेटफार्मों (लिनक्स बनाम सोलारिस vx। OS X) में कमांड से आउटपुट में अंतर के साथ निराश हो चुका हूं , अलग-अलग गोले संभवतः मामले में भी खेल रहे हैं। typeएक बेहतर विकल्प के रूप में सुझाव दिया गया है, लेकिन यह कितना पोर्टेबल होगा?

अतीत में मैंने ऐसे कार्य लिखे हैं जो whichमेरे द्वारा उपयोग किए गए विभिन्न उपयोग के मामलों को नियंत्रित करते हैं। वे मेरे द्वारा उपयोग की जाने वाली मशीनों पर काम करते हैं, और इसलिए मेरी निजी लिपियों के लिए ठीक हैं, लेकिन यह सॉफ़्टवेयर के लिए बहुत अविश्वसनीय लगता है कि मैं दूसरों के उपयोग के लिए कहीं पोस्ट करने जा रहा हूं।

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

क्या मैं typeप्लेटफार्मों पर उपलब्ध होने पर भरोसा कर सकता हूं ? क्या कोई अन्य विकल्प है whichजो आसानी से और लगातार इस सवाल का जवाब दे सकता है कि क्या किसी विशेष सॉफ्टवेयर को स्थापित किया गया है?

(यदि आप विशेष रूप से मेरे द्वारा दिए गए उदाहरण से संबंधित विचार देना चाहते हैं, तो यह बहुत अच्छा है, लेकिन मैं मुख्य रूप से केवल सामान्य मामले के बारे में पूछ रहा हूं: किसी विशेष चीज को किसी मशीन पर स्थापित किया गया है या नहीं, यह पता लगाने का सबसे विश्वसनीय तरीका क्या है ?)

जवाबों:


10

21 वीं सदी में, विशेषकर यदि आप ऐसी मशीनों को लक्षित कर रहे हैं, जिनमें बैश या zsh होने की संभावना है, तो आप typeउपलब्ध होने पर भरोसा कर सकते हैं। (यह 1970 के दशक या 1980 के दशक की शुरुआत से बहुत पुरानी यूनियनों में मौजूद नहीं था।) आप इसके आउटपुट का अर्थ कुछ भी नहीं गिना सकते, लेकिन यदि आप इस नाम से कोई आदेश देते हैं तो आप इसकी वापसी 0 पर भरोसा कर सकते हैं। नॉनवेज अन्यथा।

whichमानक नहीं है और व्यवहार में अविश्वसनीय हैtypeअनुशंसित विकल्प है। whereisके रूप में एक ही समस्याओं से ग्रस्त है whichऔर कम आम है। whenceksh और zsh के लिए विशिष्ट है।

जब यह संभव होता है, तो कमांड के अस्तित्व का परीक्षण करना और यह परीक्षण करना अधिक विश्वसनीय होगा कि उसका व्यवहार उचित है या नहीं। उदाहरण के लिए, चलाकर bash के उपयुक्त संस्करण की उपस्थिति का परीक्षण करें bash -c 'somecommand', जैसे

# Test for the `-v` operator (which appeared in bash 4.2)
if bash -c 'test -v HOME' 2>/dev/null; then 

आज आप सिंगे यूनिक्स विनिर्देश संस्करण 2 में लगभग सब कुछ पर भरोसा कर सकते हैं (फोरट्रान और एससीसीएस जैसे विदेशी सामान को छोड़कर, जो वैकल्पिक हैं)। आप अधिकांश संस्करण 3 पर भी भरोसा कर सकते हैं, लेकिन यह अभी भी हर जगह पूरी तरह से लागू नहीं हुआ है। संस्करण 4 का समर्थन स्केचियर है। यदि आप इन चश्मे को पढ़ने जा रहे हैं, तो मैं संस्करण 3 को पढ़ने की सलाह देता हूं, जो कि संस्करण 2 की तुलना में बहुत अधिक पठनीय और कम अस्पष्ट है।

सिस्टम विशिष्टताओं का पता लगाने के तरीके के रूप में उदाहरण के लिए, ऑटोकॉन्फ़ और configureविभिन्न सॉफ़्टवेयर की लिपियों को देखें।

अधिक युक्तियों के लिए पोर्टेबल शेल प्रोग्रामिंग के लिए संसाधन भी देखें ।


यह आमतौर पर उपयोग की जाने वाली अनुशंसित तकनीकों पर टिप्पणी करने के लिए विस्तार से लाभान्वित हो सकता है hashऔर command -v
कालेब

@ कालेब इस प्रश्न के उद्देश्य के लिए, मुझे command -vओवर का लाभ दिखाई नहीं देता है type, हमें केवल एक बूलियन परिणाम की आवश्यकता है। क्या आप "आमतौर पर इस्तेमाल की जाने वाली तकनीकों का उपयोग कर hashरहे हैं"
गिल्स एसओ- बुराई को रोकें '
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.