ইউনিক্স কীভাবে এক্সিকিউটেবল ফাইলগুলির সন্ধান করে?


47

যখন কোনও ফাইল কার্যকর করা হয়, ইউনিক্স কীভাবে এটি অনুসন্ধান করবে? PATH এ একই নামের একাধিক এক্সিকিউটেবল ফাইল যদি থাকে তবে কোনটি পছন্দ হয়? কোনও ফাইল কার্যকর করা হলে বর্তমান ডিরেক্টরি কি অনুসন্ধানে অন্তর্ভুক্ত রয়েছে?

মনে করুন executable.shবর্তমান ডিরেক্টরিতে নামের সাথে একটি ফাইল রয়েছে । এটি কার্যকর করা হয় যদি এটি কার্যকর করা হয় $ executedএবং এর .অংশ না হয় PATH?


উল্লেখ which <executable>কমান্ড এই থ্রেডে দরকারী হবে।
হিসাবরক্ষক

উত্তর:


45

Matching PATH প্রথম ম্যাচ এক্সিকিউটেবল চালিত হওয়ার সাথে শুরু থেকে শেষ অবধি অনুসন্ধান করা হয়। সুতরাং $ পথের শুরুতে ডিরেক্টরিগুলি পরে যেগুলি আসে তার চেয়ে বেশি প্রাধান্য পায়। বর্তমান ডিরেক্টরিতে (।) এর এক্সিকিউটেবল কেবলমাত্র যদি কার্যকর হয়। $ PATH এ রয়েছে (যা এটি সাধারণত হয় না )। অনুসন্ধানের পথে বর্তমান ডিরেক্টরিটির অন্তর্নিহিত অন্তর্ভুক্তি নেই।


এটি অদ্ভুত যে, আমার $ PATH এতে নেই ., তবে মনে হয় এটি প্রথমে বর্তমান দিরের কাছ থেকে অনুসন্ধান করা উচিত before
এরিক ওয়াং

19

বর্তমান ডিরেক্টরিতে থাকা ফাইলগুলির জন্য, আপনি সেগুলি পূর্বে করতে চাইবেন ./, যাতে কমান্ডটি হয়ে যায় ./executable.sh.অন্যান্য সমস্যাগুলির মধ্যে আপনার সুরক্ষা ঝুঁকি হওয়ার কারণে আপনার প্যাথ-এ কখনই থাকা উচিত নয় ।

যে সমস্ত ডিরেক্টরি PATH এ প্রথম আসে এবং প্রথমে অনুসন্ধান করে।

সামগ্রিক অর্ডার যদি আমি সঠিকভাবে মনে রাখা অনুসন্ধানের জন্য এই মত হল:

  • alias লেখা

  • রফতানি ফাংশন

  • অন্তর্নির্মিত শেল কমান্ড

  • আপনার पथপথের স্ক্রিপ্ট এবং বাইনারিগুলি


7
আমি হ্যাশ যুক্ত করব - বাশ মনে রাখবেন (এবং অন্যান্য শেলগুলি) সন্ধান করা আরও সহজ করার জন্য সাম্প্রতিক ব্যবহৃত কমান্ডগুলির একটি হ্যাশ রাখুন। কখনও কখনও hash -rআপনার PATH বা প্রোগ্রামের অবস্থানগুলি পরিবর্তন করা হলে আপনাকে ক্যাশে (ব্যবহার করে ) পরিষ্কার করতে হবে।
ধনী হোমোলকা

3
অনুসন্ধানের ক্রমের জন্য +1। আপনি যদি তথ্যের উত্সটি মনে করতে পারতেন তবে চমৎকার হবেন :)
twan163

8

যদিও এটির উত্তর কেউ কেউ উত্তর দিয়েছেন তবে আমি কিছু চিন্তা যুক্ত করতে চাই:

1) PATH কেবলমাত্র তখনই পরামর্শ নেওয়া হয় যদি এক্সিকিউটেবল আহবানটির কোনও পথের উপাদান না থাকে। কিছু কম্যান্ডকে $ PATH- এ দেখা হবে, ./somecommandবা /usr/bin/somecommand, বা ../../bin/somecommandকেবল PATH নয় ডিরেক্টরি নিয়ম ব্যবহার করুন

PATH- তে একই নামের সাথে একাধিক এক্সিকিউটেবল ফাইল থাকলে কোনটি পছন্দ হয়?

এটি খুঁজে পাওয়া প্রথমটিতে এসে থামে reading পাঠ পড়া থেকে বাম থেকে ডান।

ফাইলটি কার্যকর করা হলে বর্তমান ডিরেক্টরি কি অনুসন্ধানে অন্তর্ভুক্ত করা হয়?

যদি বর্তমান ডিরেক্টরিটি PATH এ থাকে তবে এটি অনুসন্ধান করা হবে। মনে রাখবেন যে PATH এর একটি খালি ডিরেক্টরিতে বর্তমান ডিরেক্টরি অন্তর্ভুক্ত রয়েছে। উদাহরণস্বরূপ PATH =: / usr / bin (খালি খালি) PATH = / usr / bin: (ফাঁকা ফাঁকা) এবং PATH = / usr / bin :: / বিন (মাঝের ফাঁকা) সমস্ত কার্যকরভাবে চলমান ডিরেক্টরি ডিরেক্টরি অন্তর্ভুক্ত করবে।

মনে করুন একটি বর্তমান ডিরেক্টরিতে এক্সিকিউটেবল.শ নামের একটি ফাইল রয়েছে। এটি কার্যকর হবে যদি এটি কার্যকর করা হয় $ মৃত্যুদন্ড কার্যকর করা হয় এবং। পথের অংশ নয়?

এটি PATH অনুসন্ধান করে এটি কখনও খুঁজে পাবে না। বর্তমান দির যদি PATH তে না থাকে তবে এটি একটি PATH অনুসন্ধানের মাধ্যমে এটি খুঁজে পাবেন না।

এটি বলেছে (এবং বিভ্রান্তি সংক্ষেপে দুঃখিত) যদি কোনও উলাম বা ফাংশন থাকে যা কমান্ডটি চালায় তবে তা চালানো হবে। অথবা যদি আপনার শেলের কোনও লোকেশন ক্যাশে থাকে এবং এক্সিকিউটেবল ক্যাশে থাকে তবে এটি এটি খুঁজে পেতে পারে। সুতরাং, এটি এটি কখনও পাথের মধ্যে খুঁজে পাবেন না , তবে এটি অন্য উপায়ে চালানো হতে পারে।


cacheনোটের জন্য ধন্যবাদ , এটি প্রায় আমাকে ক্রেজি করে তোলে যে পুরানো এক্সিকিউটেবলটি /usr/bin/এখনও নতুনটিতে প্রবেশ করেনি /usr/local/bin, তবে এটি $PATHলগ আউট না হওয়া পর্যন্ত আবার বামদিকে থাকে এবং আবার লগইন হয়।
হিসাবরক্ষক

1
@theaccountant ব্যাশ মধ্যে আপনি 'হ্যাশ -r' কি করতে পারেন শেল ক্যাশে সাফ করার
রিচ Homolka

4

আপনার পাথটি বর্তমানে কী টাইপ হয়েছে তা দেখতে echo $PATHবা printenv PATH

তারপরে আপনি অনুসন্ধানের ক্রমটি জানতে পারবেন। আপনার যদি একই নামে একাধিক ফাইল থাকে তবে কেবল ____ দেখতে কোনটি চালান।

যাত্রা।

সিস্টেম #> যা গ্রেপ

/ Usr / bin /, grep

আপনার টার্গেটের মতো কাজ করে এমন ফাইলগুলি খুঁজে পাওয়ার একটি দুর্দান্ত উপায় হ'ল এপ্রোপস ব্যবহার করা:

অ্যাপ্রোপস গ্রেপ

bzgrep (1) - নিয়মিত প্রকাশের জন্য সম্ভবত bzip2 সংক্ষেপিত ফাইলগুলি অনুসন্ধান করুন

egrep (1) - একটি প্যাটার্নের সাথে মিলছে লাইনগুলি মুদ্রণ করুন

fgrep (1) - একটি প্যাটার্নের সাথে মিলে যাওয়া প্রিন্ট করুন

গ্রেপ (1) - একটি প্যাটার্নের সাথে মিলছে লাইনগুলি মুদ্রণ করুন

এবং তাই ...


2
- ওহ হ্যাঁ আমি ভুলে গেছি whereis > whereis, grep: একটি ফাইল সমস্ত উদাহরণ এটি ফাংশন
mbb

গ্রেপ: / বিন /
গ্রেপ

whereisনয়, অবস্থানগুলির একটি হার্ডকোডযুক্ত তালিকা ব্যবহার করে $PATH
মাধ্যাকর্ষণ

@ গ্রাভিটি আপনি কি এর উপর প্রসারিত করতে পারেন?
WinEunuuchs2Unix

-2

@ কনস্লেয়ার- এক্সিকিউটেবল সন্ধানের ডিফল্ট ক্রম হ'ল বর্তমান পথ, কমান্ডগুলিতে নির্মিত এবং তারপরে $ PATH। সুতরাং যদি পিডব্লিউডে এক্সিকিউটেবল নামের একটি ফাংশন ইতিমধ্যে উপস্থিত থাকে তবে তা কার্যকর করা হয় if তবে শেল কমান্ডের মধ্যে পূর্বনির্ধারিত অনুসন্ধান এবং তারপরে $ PATH অনুসন্ধান করে


যদি আপনি 40 বছর আগে থেকে থম্পসন শেল, ম্যাসি শেল, বা অন্য কোনও জীবাশ্মধারী হোল্ডওভারের বিষয়ে কথা বলছিলেন তবে আপনি ঠিক বলেছিলেন। তবে কোনও বর্তমান, মূলধারার ইউনিক্স শেল স্বয়ংক্রিয়ভাবে বর্তমান ডিরেক্টরি অনুসন্ধান করে না।
স্কট

@ স্কট সুতরাং কোনও কমান্ডের জন্য ডিফল্ট অনুসন্ধানের পথটি প্রথমে অন্তর্নির্মিত হয় এবং তারপরে AT PATH এবং CWD অনুসন্ধান করে তবেই আমি দেই / /? আমি কি সঠিক?
proc

ঠিক আছে, এলিয়াস, ফাংশন এবং বিল্টিনগুলি। তারপরে, আপনি যদি কমান্ড (সহ ./) সহ কোনও পাথ নির্দিষ্ট করেন তবে এটি কেবল সেই ডিরেক্টরিটি অনুসন্ধান করে; অন্যথায়, এটি অনুসন্ধান করে $PATH
স্কট
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.