Application PATH এ কোনও অ্যাপ্লিকেশন বিদ্যমান কিনা তা আমি কীভাবে পরীক্ষা করব?


19

আমি আমার সমস্ত shস্টার্টআপ / এনভিভি স্ক্রিপ্টগুলি যতটা সম্ভব ডিআরওয়ির সাথে কাজ করার জন্য এবং যতটুকু লিখতে চেষ্টা করছি : "যতটা সম্ভব আমি প্রতিটি ক্লাসে এটি করেছি" এর অর্থ এটি নিশ্চিত করা যে আমি যদি কোডটি চালানোর চেষ্টা করি যা সেখানে নেই, কোডটি নিখুঁতভাবে ব্যর্থ হয়। সে লক্ষ্যে প্রোগ্রামের অস্তিত্ব আছে কিনা তা পরীক্ষা করতে সক্ষম হওয়া দরকার। কোনও ফাইল উপস্থিত থাকলে কীভাবে পরীক্ষা করতে হয় তা আমি জানি, তবে কোনও অ্যাপ্লিকেশন পাথের মধ্যে কার্যকর হয় কিনা তা পরীক্ষা করার জন্য আমি নিশ্চিত নই। এর পরিবর্তে খিলান, উবুন্টু এবং সেন্টোগুলিতে কাজ করা দরকার বলে আমি $ पथ ব্যবহার করব। কিছু আমার হোমডিরে ইনস্টল করা হতে পারে, এমন সিস্টেমে যেখানে আমার শিকড় নেই, অন্যেরা ইনস্টল নাও হতে পারে, এবং অন্যরা এখনও আমার সিস্টেমের পথে ইনস্টল রয়েছে।


2
এই এই উত্তরটি হ'ল আমি এই জাতীয় প্রশ্নের জন্য বুকমার্ক করেছি।
jw013

উত্তর:


19

ব্যবহার type commandnamecommandnameএক্সিকিউটযোগ্য কিছু হ'ল এটির সত্যটি ফিরে আসে : উরফ, ফাংশন, অন্তর্নির্মিত বা বাহ্যিক কমান্ড (সন্ধান করা $PATH)। বিকল্পভাবে, command commandnameযদি commandnameঅন্তর্নির্মিত বা বাহ্যিক কমান্ড (সন্ধান করা হয় $PATH) হয় যা সত্যটি প্রত্যাশা করে তা ব্যবহার করুন ।

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

কয়েকটি শ-র ভেরিয়েন্ট রয়েছে (স্পষ্টভাবে পূর্ব- /bin/shপসিক্স ; আমি ওএসএফ 1 ≤3.x এর নীচে জানি এবং নেটবসডি-র প্রাথমিক সংস্করণ এবং 20-শতাব্দীর কয়েকটি লিনাক্স বিতরণে পাওয়া অ্যালকুইস্ট শেলের কয়েকটি সংস্করণ সম্পর্কে জানি ) যেখানে typeসর্বদা 0 আসে বা আসে না বিদ্যমান। আমি মনে করি না এই সহস্রাব্দ সহ কোনও সিস্টেম পাঠানো হয়েছে। যদি আপনি তাদের সাথে কখনও মুখোমুখি হন তবে এখানে একটি ফাংশন রয়েছে যা আপনি $PATHম্যানুয়ালি অনুসন্ধান করতে ব্যবহার করতে পারেন :

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

আপনি বিল্ট-ইনগুলি এবং ফাংশনগুলি বাদ দিতে এবং নামটি সন্ধান করতে চাইলে এই ফাংশনটি সাধারণত কার্যকর $PATH। বেশিরভাগ শাঁসগুলির জন্য এটি অন্তর্নির্মিত রয়েছে command -v, যদিও এটি পসিক্সের তুলনায় সাম্প্রতিকতম সংযোজন (এখনও পসিক্স হিসাবে alচ্ছিক: 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 fooযদি fooঅন্তর্নির্মিত বা ফাংশন হয় তবে 0 হয়; আপনি যদি এক্সিকিউটেবলের জন্য পরীক্ষা করতে চান $PATH, আপনার আউটপুটটি খালি নয় তা যাচাই করতে হবে। type -pপসিক্সে নেই; উদাহরণস্বরূপ ডেবিয়ানের ছাই (যা /bin/shউবুন্টুতে রয়েছে) এটি নেই।


@ গিলিস, এটি কি (বা অনুরূপ কিছু) if [ type keychain ]; thenকাজ করবে না? আমি ত্রুটি /home/xenoterracide/.zshrc:84: parse error: condition expected: typeপেয়েছি আমি মনে করি আমি লিখতে পারলাম ফাংশনটি বিদ্যমান ... আমি কেবল ভেবেছিলাম এটি একটি অর্থে সহজ হতে পারে ...
xenoterracide

@ এক্সেনোটেরাকাইড: বন্ধনীগুলি ফেলে দিন!
গিলস 'অসন্তুষ্ট হওয়া বন্ধ করুন'

আমি মনে করি আপনি খুঁজছেন if type $APP >/dev/null 2>/dev/null; then ...আপনি চান না []
স্টিভেন ডি

4
বাহ, আমি জানতাম আমার সতেজ হওয়া উচিত। আবার গিলসকে মারলেন!
স্টিভেন ডি

type -pযদি আপনি নির্দিষ্টভাবে কোনও কমান্ডের সন্ধান করেন $PATH(উপকরণ বা ফাংশন বা বিল্টিন নয়)।
প্রাক্তন

1

আপনি যদি কেবল বাহ্যিক প্রোগ্রামগুলির সন্ধান করেন তবে আপনি কোনটি ব্যবহার করতে পারেন। যদিও এটি বহনযোগ্য জানেন না।


3
তত্ত্বগতভাবে, এটি typeবা এর চেয়ে কম পোর্টেবল command; whichউদাহরণস্বরূপ, পসিক্সে নেই। অনুশীলনে, whichপ্রায় সর্বত্রই বিদ্যমান, তবে কিছু জায়গায় (যেখানে এটি একটি সিএস স্ক্রিপ্ট হিসাবে প্রয়োগ করা হয়েছে) এটি একটি পৃথক পথ ব্যবহার করে (এ কারণে .cshrc), যা উদ্দেশ্যকে পরাস্ত করে।
গিলস 'তাই খারাপ হওয়া বন্ধ করুন'
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.