उपनाम अन्य प्रविष्टियों को "ओवरराइड" नहीं करता है?


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
कैन-नेड_फूड

अप्रचलित सावधानी: सामान्य तौर पर, सामान्य आदेशों का नाम बदलना अच्छा नहीं है। यह आपको दो तरीके से काट सकता है। 1) यदि आप किसी अन्य सिस्टम पर काम करते हैं और आदत से अपनी कमांड का उपयोग करते हैं, तो आपको देशी कमांड का अप्रत्याशित व्यवहार मिलेगा। 2) यदि कोई अन्य आपके सिस्टम का उपयोग करता है, यहां तक ​​कि आपको किसी समस्या को हल करने की सलाह / मदद करने के लिए, तो उन्हें आपके अनुकूलन का अप्रत्याशित व्यवहार मिलेगा। कस्टम कमांड ठीक हैं, बस उन्हें सामान्य मौजूदा लोगों के समान नाम नहीं दें।
जो

@ जोए वास्तव में यह यहाँ अधिक उल्टा है: cp के os / x संस्करण में निक्स से विकल्पों का अभाव है, इसलिए यह अपेक्षा के अनुरूप व्यवहार नहीं करता है (सिवाय उनके जो *
हॉबल्ड

जवाबों:


21

whichआदेश रिटर्न केवल निष्पादनयोग्य: यह, उपनाम के बारे में कुछ भी नहीं जानता है, क्योंकि यह एक बाहरी कार्यक्रम है, और वहाँ एक बच्चे की प्रक्रिया के रूप में नामित जानकारी पारित करने के लिए कोई तंत्र है।

यदि आप कमांड दर्ज करते हैं तो आप 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

यह एक प्रतीकात्मक लिंक बनाता है, हालांकि आप इसे थोड़ा और अधिक कुशल हार्ड लिंक (omit -s) बना सकते हैं, लेकिन इसके लिए सामान्य रूप से रूट अनुमतियों ( sudo ln ...) की आवश्यकता होगी । फ़ंक्शन बनाना और PATHवैरिएबल में जोड़ना bashउपयोगकर्ता अनुमतियों के साथ स्टार्ट-अप स्क्रिप्ट में से एक में किया जाएगा ।


1
हालांकि CentOS (और AIUI सभी RedHat) पर मानक प्रोफ़ाइल (जब तक कि ओवरराइड नहीं होती) उस के लिए एक उपनाम बनाता है जो इनपुट के आउटपुट से whichरन /usr/bin/whichकरता है, aliasएक विकल्प जो इसे उस इनपुट को पढ़ने के लिए कहता है और यदि वह मेल खाता है तो एक अन्य को दिखाने के लिए इसका उपयोग करता है आदेश। Unix.stackexchange.com/questions/10525/…
dave_thompson_085

@ dave_thompson_085 - दिलचस्प टिप्पणी: मैंने उन वितरणों का उपयोग नहीं किया है। मैं उबंटू का उपयोग करता हूं और मुझे केवल उर्फ whichकरने से एक ही प्रभाव मिल सकता है type। फिर which -aबाहरी प्रोग्राम की तरह संचालित होता है, उपनाम और फ़ंक्शन परिभाषाओं के अलावा। सामान्य तौर पर मैं नहीं करता alias which=type, क्योंकि मैं $(which ProgName)तब उपयोग करना पसंद करता हूं, जब मैं किसी अन्य उपनाम या फ़ंक्शन परिभाषा को दरकिनार करके किसी बाहरी कार्यक्रम का उपयोग करना चाहता हूं।
AFH

1
हार्ड लिंक फाइल सिस्टम को पार नहीं कर सकते हैं, इसलिए गैर-प्रतीकात्मक lnसुझाव केवल तभी काम करेगा जब आपका होम डायरेक्टरी उसी फाइल सिस्टम पर हो /usr/local/bin। यदि आप अपडेट करते हैं तो यह भी अजीब तरह से व्यवहार करेगा gcp, क्योंकि आपका हार्ड लिंक शायद अभी भी पुराने संस्करण को संदर्भित करेगा।
बेकार

@ यूलेस - मान्य बिंदु, जो इस बात का हिस्सा है कि मैंने पहले एक प्रतीकात्मक लिंक का सुझाव देने के लिए अपने जवाब को संपादित किया, हालांकि मुझे लगता है कि अनुमतियाँ शायद सबसे महत्वपूर्ण विचार हैं। अपडेट करने के लिए gcp, यह निर्भर करेगा कि अपडेट खोलने और लिखने या हटाने और फिर से बनाने के द्वारा किया गया है या नहीं। ध्यान दें कि यह सारहीन है कि क्या एक कठिन लिंक बनाने के लिए एक निरपेक्ष या रिश्तेदार स्रोत पथ का उपयोग किया जाता है, जबकि एक प्रतीकात्मक लिंक को आमतौर पर एक पूर्ण मार्ग की आवश्यकता होती है। लिंक का उपयोग ओएस में बड़े पैमाने पर किया जाता है, और वे ज्यादातर प्रतीकात्मक होते हैं।
AFH

1
@ कैन-नेड_फूड - वर्तमान शेल में इसे सेट करना उतना आसान नहीं है: इसे प्रत्येक लिपि में सेट किया जाना है, साथ में उपनामों को आयात करना है।
AFH

13

उपनाम शेल के लिए आंतरिक हैं। अन्य कार्यक्रमों के बारे में उन्हें नहीं पता होगा।

whichएक बैश बिलिन नहीं है (यह कुछ अन्य गोले, जैसे zsh में एक बिलिन है)। चूंकि whichबाश के उपनामों में कोई विशेषाधिकार प्राप्त जानकारी नहीं है, whichबस PATHदिए गए शब्द के माध्यम से दिखता है ।

typeदूसरी तरफ है एक बैश निर्मित, तो यह उपनाम पर रिपोर्ट कर सकते हैं।


2
और, इसके अलावा, उपनाम केवल एक कमांड में पहला शब्द होने पर विस्तारित होते हैं। शायद यह प्रासंगिक नहीं है।
कैन-नेड_फूड
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.