বাশে এক্সিকিউটেবলের অর্ডার শুরু হয়েছিল


14

যদি আমি testকমান্ডটি ব্যাশে চালিত করি, test(শর্তযুক্ত ভাবের মূল্যায়ন করে) অন্তর্নির্মিত ইউটিলিটিটি শুরু করা হয়:

$ type test
test is a shell builtin
$ type -a test
test is a shell builtin
test is /usr/local/bin/test
test is /usr/bin/test
$ 

যাইহোক, type -a testউপরের আউটপুট হিসাবে দেখা গেছে , test/ usr / স্থানীয় / বিন ডিরেক্টরিতে অন্য একটি এবং / usr / বিন ডিরেক্টরিতে অন্য একটি রয়েছে। এক্সিকিউটেবলকে কীভাবে অর্ডার করা হয়, যেমন বিল্ট-ইন কমান্ডগুলি সর্বদা পছন্দ করা হয় এবং তারপরে বাকী কমান্ডগুলি order PATH ভেরিয়েবলের ডিরেক্টরি আদেশের উপর নির্ভর করে? এছাড়াও, নির্বাহযোগ্যদের শুরু করা ক্রমের পরিবর্তন করা কি সম্ভব, যেমন আমি যদি টাইপ করি test, তবে / ইউএসআর / বিন / পরীক্ষা বাশ-বিল্টিনের পরিবর্তে শুরু করা হবে test?


কমান্ডটি কল করার সময় আপনি পুরো পথটি নির্দিষ্ট করতে পারেন, উদাহরণস্বরূপ, /usr/bin/test -f "$file"...
জেসনওয়ারিয়ান

@ জেসনওয়ারিয়ান আমি এটি সম্পর্কে অবহিত, তবে এক্সিকিউটেবলের ক্রম পরিবর্তন করার কোনও উপায় যদি শুরু হয় তবে আমি কেবল আগ্রহী।
মার্টিন

উত্তর:


25

সর্বাধিক অগ্রাধিকার হ'ল বাশ ওরফে, তারপরে বিশেষ বিল্টিনস (কেবলমাত্র পসিক্স মোডে), তারপরে ফাংশনগুলি, তারপরে বিল্টিনগুলি, তারপরে একটি অনুসন্ধান $PATH

একটি বিল্টিন কার্যকর করতে, ব্যবহার করুন builtin test
একটি বহিরাগত অ্যাপ্লিকেশন চালানো করার জন্য, একটি সুনির্দিষ্ট পাথ ব্যবহার করুন: /bin/test
ফাংশন এবং উপকরণ উপেক্ষা করার জন্য, ব্যবহার করুন command test
কেবল উপনামকে বাইপাস করতে, ব্যবহার \testবা অন্য কোনও প্রকারের প্রসারণ।

এর সাথে একটি বিল্টিন অক্ষম করা / সক্ষম করা সম্ভব enable test

(নীচের মন্তব্য অনুযায়ী আপডেট করা হয়েছে)
(ব্যাশ disableঅন্তর্নির্মিত যে স্থির ভুল প্রশাসক সম্পাদনা - বাস্তবে কেবল আছে enable)


1
@ 1_CR জেনা 2 এক্স ঠিক আছে। আমার উত্তরটি বিশেষ বিল্টিনগুলি বাদ দিয়েছে, যা পসিক্স অনুযায়ী ফাংশনগুলির চেয়ে বেশি অগ্রাধিকার নেয় (যদিও কিছু শেল অনুপযুক্ত নয়; ব্যাশ কেবলমাত্র পসিক্স মোডে মেনে চলে)।
গিলস 23'55

1
প্রস্তাবিত সম্পাদন করা: আপনি যখন কমান্ড (অথবা এটা কোন অংশ) উদ্ধৃত ওরফে অক্ষম হয়, হিসাবে \testবা 'test'বা tes't'
জন কুগেলম্যান

2
এটি পুরো ছবি নয়। যেকোন প্রকারের সম্প্রসারণ (ব্যাশ ম্যানুয়াল, সমস্ত প্রতিস্থাপন, টিলডে সম্প্রসারণ এবং তথাকথিত সম্প্রসারণ ) প্রহেলাকে অক্ষম করে। আমি চেষ্টা করেছিলাম.
gena2x

1
বাশ ম্যান পৃষ্ঠা থেকে উদ্ধৃতি: "প্রতিটি সাধারণ কমান্ডের প্রথম শব্দটি যদি উদ্ধৃত না হয় তবে এটির একটি উলাম আছে কিনা তা পরীক্ষা করা হয় so যদি থাকে তবে সেই শব্দটির পরিবর্তে উপন্যাসের পাঠ্যটি প্রতিস্থাপন করা হয়েছে The অক্ষরগুলি /,$ , ব্যাকটিক, এবং =এবং উপরের তালিকাভুক্ত শেল মেটাচার্যাক্টর বা উদ্ধৃতিযুক্ত অক্ষরগুলির কোনও একটি নামের নাম উপস্থিত নাও হতে পারে। "
জন কুগেলম্যান

2
আমাকে এই তথ্যের উত্স সন্ধানে সহায়তা করার ইঙ্গিতগুলির জন্য +1: এটি ব্যাশ ম্যান পৃষ্ঠায়, কম্যান্ড এক্সিকিউশন, দ্বিতীয় এবং তৃতীয় অনুচ্ছেদ বিভাগের অধীনে রয়েছে।
twan163

6

অন্তর্নির্মিত কমান্ডগুলি সর্বদা বাহ্যিক কমান্ডগুলিতে পছন্দ হয়। যুক্তিটি হ'ল বিল্ট-ইন কমান্ডটি দ্রুত (এবং কয়েকটি ক্ষেত্রে যেমন cdবা কেবল বিল্ট-ইন কমান্ডই পছন্দসই প্রভাব ফেলতে পারে)।test -o BASH_OPTION

কখনও কখনও বাহ্যিক কমান্ডের এমন দক্ষতা থাকতে পারে যা শেলটি অন্তর্নির্মিত হয় না। সেক্ষেত্রে আপনি বাহ্যিক কমান্ডকে একটি স্পষ্ট পথ (অর্থাত্ একটি স্ল্যাশযুক্ত) দিয়ে কল করতে পারেন (এটি অর্ডার সম্পর্কে কোনও উদ্বেগকে ছাড়িয়ে যায় $PATH)। আপনি যদি বাহ্যিক পথটিকে হার্ড-কোড করতে না চান তবে আপনি বিল্টিনের ব্যবহার রোধ করতে চান, আপনি ব্যাশ, ksh এবং zsh এ "$(type -P test)"(নোট মূলধন P) ব্যবহার করতে পারেন । বাহ্যিক কমান্ডের ব্যবহারকে বাধ্য করার আরেকটি উপায় হ'ল বিল্টিন ( ) ব্যবহার করা বা ইউটিলিটিটি ( ) ব্যবহার করা।"$(whence -p test)"=testcommandcommand -p test …envenv test …

Zsh এ, আপনি এর সাথে একটি বিল্টিন অক্ষম করতে পারেন disable test। বিল্টিনটি পুনরায় সক্ষম না করা পর্যন্ত এটি স্থায়ী (বর্তমান শেল বা সাবশেলের জন্য) enable test। ব্যাশে, আপনি enable -n testঅক্ষম করতে এবং enable testপুনরায় সক্ষম করতে একই কাজ করতে পারেন ।

আপনি একটি পৃথক কমান্ড কার্যকর করতে বাধ্য করার জন্য একটি নাম বা ফাংশন ব্যবহার করতে পারেন, উদাহরণস্বরূপ alias test=/usr/bin/testবা test () { /usr/bin/test "$@"; }। আপনার যদি এমন কোনও উপাধি থাকে তবে আপনি এর কোনও অংশ উদ্ধৃত করে এর ব্যবহার রোধ করতে পারেন, যেমন\test সাধারণ ফাংশন / বিল্টিন / বাহ্যিক অনুসন্ধান সম্পাদন করবে। নোট করুন যে শেল এবং তার সেটিংসের উপর নির্ভর করে কোনও ফাংশনটিতে পড়ার সময় বা এটি কার্যকর করার সময় কোনও ফাংশনে উরফ সংজ্ঞাগুলি বাড়ানো যেতে পারে। যদি আপনি কোনও ফাংশন সংজ্ঞায়িত করেন তবে আপনি ফাংশন সন্ধানের command testপাশাপাশি ওরফে testলুকোচুরি প্রতিরোধ করতেও ব্যবহার করতে পারেন (তাই এখানে বিল্টিন অক্ষম না করা হলে আহ্বান করা হবে)।


wouldnt envএখানে খুব উপযুক্ত হতে?
স্টিভেন পেনি

সুতরাং, যদি শেলটি ব্যাসিবক্স থেকে চালিত হয়, অন্য, সাধারণত একই ব্যাসিবক্সের বহিরাগত আদেশগুলি ইন্টার্নাল হিসাবে বিবেচিত হয়? উদাহরণস্বরূপ, আমি dfপ্রথম অবস্থানে একটি PATH- তে পূর্ণ যুক্ত হয়েছি , 'ডিএফ' অপসারণ করেছি, which dfশো / অপ্ট / বিন / ডিএফ, কিন্তু ডিএফ চালাচ্ছি / বিন / ডিএফ -> ব্যস্তবক্স
পাপো

@ পাপো which dfআপনাকে কীভাবে dfচালায় তা অগত্যা আপনাকে দেখায় না । unix.stackexchange.com/questions/85249/…
অশুভ হওয়া বন্ধ করুন '
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.