এলিয়াস PATH এন্ট্রিগুলিকে "ওভাররাইড" করে না?


9

আমার শেষ লাইনটি .bash_profileহ'ল:

alias cp=/usr/local/bin/gcp

তবে এটি আমার প্রবেশের দ্বারা স্কোয়াশ করা হচ্ছে $PATH:

$which cp
/bin/cp
11:54:32/OCspark $type cp
cp is aliased to `/usr/local/bin/gcp'

আমি ভেবেছিলাম যে এলিয়াসগুলি ওভাররাইড করে PATH..?


1
রেকর্ডের জন্য: প্রযুক্তিগতভাবে, এলিয়াসগুলি এনভেরের কোনও মানকে ওভাররাইড করে নাPATH
can-ned_food

বাধ্যতামূলক সতর্কতা: সাধারণভাবে, কমান্ডের নতুন নামকরণ করা ভাল অনুশীলন নয়। এটি আপনাকে দুটি উপায়ে কামড় দিতে পারে। 1) আপনি যদি অন্য কোনও সিস্টেমে কাজ করেন এবং অভ্যাস অনুসারে আপনার কমান্ডটি ব্যবহার করেন তবে আপনি দেশীয় কমান্ডের অপ্রত্যাশিত আচরণ পাবেন। ২) অন্য কেউ যদি আপনার সিস্টেমটি ব্যবহার করে এমনকি কোনও সমস্যা সমাধানে পরামর্শ / সহায়তা করার জন্য তারা আপনার কাস্টমাইজেশনের অপ্রত্যাশিত আচরণ পাবে। কাস্টম কমান্ডগুলি ঠিক আছে, কেবল তাদের সাধারণ বিদ্যমানগুলির মতো নাম রাখবেন না।
জো

আরো @joe বাস্তবিক এটা রিভার্স এখানে: OS / এক্স সংস্করণ CP থেকে অপশন অভাব আছে তুষার আশানুরূপ তাই এটি আচরণ করে না (যারা মত * ছাড়া hobbled ম্যাক সংস্করণ)
javadba

উত্তর:


21

whichকমান্ড আয় শুধুমাত্র এক্সেকিউটেবল: এটা, alias লেখা সম্পর্কে কিছুই জানে না যেহেতু এটি একটি বহিস্থিত প্রোগ্রাম, এবং সেখানে একটি শিশু প্রক্রিয়া ওরফে তথ্য ক্ষণস্থায়ী জন্য কোন প্রক্রিয়া।

আপনি যদি কমান্ডটি প্রবেশ করেন তবে আপনি type -a cpপছন্দগুলি পছন্দ অনুসারে সমস্ত সম্ভাব্য ব্যাখ্যা দেখতে পাবেন। এই কোন ওরফে অন্তর্ভুক্ত যেহেতু typeএকটি হল bashঅভ্যন্তরীণ কমান্ড।

এটি উপলব্ধি করা গুরুত্বপূর্ণ যে কোনও উপ-প্রক্রিয়া যেমন কোনও স্ক্রিপ্ট বা ইন্টারেক্টিভ সম্পাদক দ্বারা সিস্টেম কমান্ডগুলি চালনার বিকল্প রয়েছে এমন কোনও উপাধির ব্যাখ্যা করা হবে না।

আপনি যদি cpকোনও ফাংশন করেন, তবে অন্যান্য সংস্করণ থেকে না হলেও আপনার সংস্করণটি স্ক্রিপ্টগুলিতে চলবে:

cp() { /usr/local/bin/gcp "$@"; }

আপনি যদি cpসর্বত্র কাজ করতে চান তবে $HOME/binআপনার PATHতালিকার শীর্ষে যুক্ত করুন এবং $HOME/bin/cpএটি নির্দেশ করুন:

ln -s /usr/local/bin/gcp $HOME/bin/cp

এটি একটি প্রতীকী লিঙ্ক তৈরি করে, যদিও আপনি এটিকে কিছুটা আরও কার্যকর হার্ড লিঙ্ক তৈরি করতে পারেন (বাদ দিতে পারেন -s) তবে এটির জন্য সাধারণত রুট অনুমতিগুলির প্রয়োজন হবে ( sudo ln ...)। কোনও ফাংশন তৈরি করা এবং PATHভেরিয়েবলে যুক্ত করা bashব্যবহারকারীর অনুমতি নিয়ে একটি স্টার্ট-আপ স্ক্রিপ্টে করা হবে।


1
যদিও সেন্টওএস (এবং AIUI সব তাহলে RedHat) মান প্রোফাইল (যদি না উপেক্ষিত) একটি তৈরি করে ওরফে জন্য whichযে রান /usr/bin/whichআউটপুট থেকে পাইপ ইনপুট সঙ্গে aliasএবং একটি বিকল্প এটি বলে যে ইনপুট পড়তে এবং এটি ব্যবহার করতে হলে ম্যাচ উপনাম দেখানোর জন্য কমান্ড। দেখুন unix.stackexchange.com/questions/10525/...
dave_thompson_085

@ dave_thompson_085 - আকর্ষণীয় মন্তব্য: আমি এই বিতরণগুলি ব্যবহার করি নি। আমি উবুন্টু ব্যবহার এবং আমি কেবল aliasing দ্বারা একই ঘটনা ঘটে প্রভাব পেতে পারেন whichকরতে type। তারপরে which -aবাহ্যিক প্রোগ্রামের মতো চালনা করে, উপাধি এবং ফাংশন সংজ্ঞা যুক্ত করে। সাধারণভাবে আমি তা করি না alias which=type, কারণ আমি $(which ProgName)যখন কোনও বাহ্যিক প্রোগ্রাম বা ফাংশন সংজ্ঞা বাইপাস করে বাহ্যিক প্রোগ্রামের ব্যবহারকে বাধ্য করতে চাই তখন আমি এটি ব্যবহার করতে পছন্দ করি।
এএফএইচ

1
হার্ড লিঙ্কগুলি ফাইল সিস্টেমগুলি অতিক্রম করতে পারে না, সুতরাং অ-প্রতীকী lnপরামর্শ কেবল তখনই কাজ করবে যদি আপনার হোম ডিরেক্টরিটি একই ফাইল সিস্টেমে থাকে /usr/local/bin। এটি আপডেট করার সাথে সাথে এটি অদ্ভুত আচরণ করবে gcpকারণ আপনার হার্ড লিঙ্কটি সম্ভবত এখনও পুরানো সংস্করণটি উল্লেখ করবে।
বেহুদা

@ ব্যবহারহীন - বৈধ পয়েন্ট, যা আমি প্রথমে একটি প্রতীকী লিঙ্কের পরামর্শ দেওয়ার জন্য আমার উত্তরটি সম্পাদনা করেছি তারই একটি অংশ, যদিও আমি মনে করি যে অনুমতিগুলি সম্ভবত সবচেয়ে গুরুত্বপূর্ণ বিবেচনা। আপডেট করার ক্ষেত্রে gcpএটি নির্ভর করবে যে আপডেটটি খোলার এবং লেখার মাধ্যমে বা মুছে ফেলা এবং পুনর্নির্মাণের মাধ্যমে করা হয়েছে। মনে রাখবেন যে হার্ড লিঙ্ক তৈরি করতে কোনও পরম বা আপেক্ষিক উত্স পথ ব্যবহার করা হচ্ছে কিনা তা নিরবচ্ছিন্ন, অন্যদিকে প্রতীকী লিঙ্কটির জন্য সাধারণত একটি নিখুঁত পথের প্রয়োজন হয়। লিঙ্কগুলি ওএসে ব্যাপকভাবে ব্যবহৃত হয় এবং সেগুলি বেশিরভাগই প্রতীকী।
এএফএইচ

1
@ ক্যান-নেড_ফুড - এটি বর্তমান শেলটিতে সেট করার মতো সহজ নয়: এটি আলাদা আলাদা আলাদা আলাদা আলাদা আলাদা আলাদা আলাদা আলাদা আলাদা আলাদা আলাদা আলাদা আলাদা আলাদা আলাদা আলাদা আলাদা আলাদা আলাদা আলাদা আলাদা আলাদা আলাদা আলাদা আলাদা আলাদা আলাদা আলাদা আলাদা আলাদা আলাদা আলাদা আলাদা আলাদা আলাদা আলাদা আলাদা আলাদা আলাদা আলাদা আলাদা আলাদা আলাদা আলাদা আলাদা আলাদা আলাদা লেবার সেট করে রাখতে হবে!
এএফএইচ

13

উপনামগুলি শেলের অভ্যন্তরীণ। অন্যান্য প্রোগ্রামগুলি তাদের সম্পর্কে জানতে পারবে না।

whichবাশ অন্তর্নির্মিত নয় (এটি অন্য কয়েকটি শেলের মধ্যে একটি বিল্টিন, যেমন zsh)। যেহেতু whichবাশের আলিয়াসগুলিতে কোনও সুবিধাযুক্ত তথ্য নেই, whichকেবলমাত্র PATHপ্রদত্ত শব্দটির সন্ধান করুন।

typeঅন্যদিকে হল একটি ব্যাশ builtin, তাই এটি alias লেখা উপর প্রতিবেদন করতে পারেন।


2
এবং, এছাড়াও, কমান্ডের প্রথম শব্দটি হলে কেবলমাত্র এলিয়াসগুলি প্রসারিত হয়। সম্ভবত এটি প্রাসঙ্গিক নয়।
can-ned_food
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.