मैं यह देखने के लिए परीक्षण कैसे करूं कि क्या कोई एप्लिकेशन $ PATH में मौजूद है?


19

मैं अपने सभी shस्टार्टअप / env स्क्रिप्ट को ज्यादा से ज्यादा DRY और ज्यादा से ज्यादा काम करने के लिए लिखने की कोशिश कर रहा हूँ : "हर * nix पर काम करता है मैं इसे क्लोन करता हूँ", जितना संभव हो सके। इसका मतलब यह है कि अगर मैं कोड को चलाने की कोशिश करता हूं जो कि नहीं है, तो यह कोड इनायत से विफल हो जाता है। अगर कार्यक्रम मौजूद हैं तो मुझे परीक्षण करने में सक्षम होना चाहिए। मुझे पता है कि यदि कोई फ़ाइल मौजूद है तो परीक्षण कैसे करें, लेकिन मुझे यकीन नहीं है कि यह देखने के लिए परीक्षण कैसे किया जाए कि कोई एप्लिकेशन पथ के भीतर निष्पादन योग्य है या नहीं। मैं इसके बजाय $ PATH का उपयोग करना चाहूंगा, क्योंकि इनमें से कुछ को आर्क, ubuntu और सेंटो पर काम करने की आवश्यकता है। कुछ को मेरे होमडेयर में स्थापित किया जा सकता है, उन प्रणालियों पर जहां मेरे पास रूट नहीं है, दूसरों को स्थापित नहीं किया जा सकता है, और अन्य अभी तक सिस्टम पथों में स्थापित नहीं किए गए हैं।


2
यह SO उत्तर वह है जिसे मैंने ऐसे प्रश्नों के लिए बुकमार्क किया है।
jw013

जवाबों:


19

का उपयोग करें type commandname। यह सच है अगर commandnameकुछ भी निष्पादन योग्य है: उपनाम, फ़ंक्शन, अंतर्निहित या बाहरी कमांड (ऊपर देखा गया $PATH)। वैकल्पिक रूप से, command commandnameजो commandnameएक अंतर्निहित या बाहरी कमांड (ऊपर देखा गया $PATH) है, तो सही है।

exists () {
  type "$1" >/dev/null 2>/dev/null
}

कुछ श वेरिएंट हैं (निश्चित रूप से प्री-पॉसिक्स; मुझे /bin/shOSF1 .3.x के तहत पता है और शुरुआती नेटबीएसडी संस्करणों और कुछ 20 वीं सदी के लिनक्स वितरण में पाए जाने वाले अल्मक्विस्ट शेल के कुछ संस्करण हैं) जहां typeहमेशा रिटर्न होता है या नहीं मौजूद। मुझे नहीं लगता कि इन सहस्राब्दी के साथ किसी भी सिस्टम को भेज दिया गया है। यदि आप कभी भी उनका सामना करते हैं, तो यहां एक फ़ंक्शन है जिसका उपयोग आप $PATHमैन्युअल रूप से खोज करने के लिए कर सकते हैं :

exists () { (
    IFS=:
    for d in $PATH; do
      if test -x "$d/$1"; then return 0; fi
    done
    return 1
) }

यह फ़ंक्शन आम तौर पर उपयोगी है यदि आप बिल्ट-इन और फ़ंक्शंस को बाहर करना चाहते हैं और नाम को देखना चाहते हैं $PATH। अधिकांश गोले में इसके लिए एक अंतर्निहित है command -v, हालांकि, यह POSIX के लिए एक अपेक्षाकृत हालिया जोड़ है (अभी भी POSIX के रूप में वैकल्पिक है: 2004)। यह मूल रूप से एक प्रोग्रामर-अनुकूल संस्करण है type: यह एक निष्पादन योग्य के लिए पूर्ण पथ प्रिंट करता है $PATH, एक अंतर्निहित या फ़ंक्शन के लिए नंगे नाम, और एक उपनाम के लिए एक अन्य परिभाषा।

exists_in_path () {
  case $(command -v -- "$1") in
    /*) return 0;;
    alias\ *) return 1;; # alias
    *) return 1;; # built-in or function
  esac
}

Ksh, bash और zsh में भी type -pकेवल निष्पादक दिखना है $PATH। ध्यान दें कि बैश में, वापसी की स्थिति type -p foo0 है यदि fooएक अंतर्निहित या फ़ंक्शन है; यदि आप एक निष्पादन योग्य के लिए परीक्षण करना चाहते हैं $PATH, तो आपको यह जांचने की आवश्यकता है कि आउटपुट खाली नहीं है। type -pPOSIX में नहीं है; उदाहरण के लिए डेबियन की राख (जो /bin/shउबंटू पर है) में यह नहीं है।


@gilles, क्या यह (या कुछ इसी तरह) if [ type keychain ]; thenकाम नहीं करेगा? मुझे /home/xenoterracide/.zshrc:84: parse error: condition expected: typeलगता है कि मुझे लगता है कि मुझे लगता है कि मैं लिख सकता हूं कि फ़ंक्शन मौजूद है ... मुझे लगा कि यह एक अर्थ में सरल हो सकता है ...
xenoterracide

@xenoterracide: कोष्ठक ड्रॉप करें!
गिल्स एसओ- बुराई को रोकना '

मुझे लगता है कि आप ढूंढ रहे हैं if type $APP >/dev/null 2>/dev/null; then ...आप नहीं चाहते हैं []
स्टीवन डी

4
बाह, मुझे पता था कि मुझे तरोताजा होना चाहिए था। गिल्स द्वारा फिर से हराया!
स्टीवन डी

type -pयदि आप विशेष रूप से $PATH(उपनाम या फ़ंक्शन या बिल्डिंस नहीं) में एक कमांड की तलाश कर रहे हैं ।
युगांतरकारी

1

यदि आप केवल बाहरी कार्यक्रमों की तलाश कर रहे हैं, तो आप इसका उपयोग भी कर सकते हैं। पता नहीं कितना पोर्टेबल है।


3
सिद्धांत रूप में, यह typeया की तुलना में कम पोर्टेबल है command; whichउदाहरण के लिए, POSIX में नहीं है। व्यवहार में, whichलगभग हर जगह मौजूद होता है, लेकिन कुछ स्थानों पर (जहां इसे csh स्क्रिप्ट के रूप में लागू किया जाता है) यह एक अलग पथ (कारण) का उपयोग करता है .cshrc, जो उद्देश्य को हरा देता है।
गिल्स एसओ- बुराई को रोकना '
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.