अलियास कमांड पर `किस` का उपयोग कैसे करें?


76

अधिकांश उपयोगकर्ताओं की तरह, मेरे पास अक्सर उपयोग किए जाने वाले कार्यक्रमों के लिए फ़्लैग का डिफ़ॉल्ट सेट देने के लिए एलियाज़ का एक समूह होता है। उदाहरण के लिए,

alias vim='vim -X'
alias grep='grep -E'
alias ls='ls -G'

समस्या यह है कि मैं उपयोग करना चाहते हैं whichदेखने के लिए जहां मेरी vim/ grep/ ls/ आदि से, उर्फ रास्ते में हो जाता है आ रहा है:

$ which vim
vim: aliased to vim -X

यह उपयोगी आउटपुट है, लेकिन इस मामले में मैं जो नहीं देख रहा हूं; मुझे पता vimहै कि वह उर्फ ​​है, vim -Xलेकिन मैं जानना चाहता हूं कि vim वह कहां से आ रहा है।

अल्पकालिक रूप से उर्फ ​​को परिभाषित करने के लिए छोटा है, इसलिए मैं इस whichपर उपयोग कर सकता हूं , क्या whichउर्फ को 'अनफ्रैप' करने और उस पर खुद को चलाने का एक आसान तरीका है?

संपादित करें: ऐसा लगता है कि whichएक शेल-बिलिन है जिसमें विभिन्न शेल के विभिन्न व्यवहार हैं। बैश में, सीजएक्सएक्स --skip-aliasध्वज के सुझाव पर काम करता है; हालाँकि, मैं Zsh पर हूँ। क्या वहां भी कुछ ऐसा ही है?


zsh में, यदि आप जानना चाहते हैं कि vimयह कहां से आ रहा है , तो आप उपयोग करेंगेwhere vim
मतिजा नलिस

जवाबों:


105

whichवास्तव में इस तरह की चीजों को करने का एक बुरा तरीका है, क्योंकि यह आपके पर्यावरण के आधार पर $SHELLऔर स्टार्टअप फ़ाइलों (यह सोचता है) के बारे में अनुमान लगाता है ; न केवल यह कभी-कभी गलत लगता है, लेकिन आप आमतौर पर इसे अलग तरह से व्यवहार करने के लिए नहीं कह सकते हैं। ( whichमेरे Ubuntu 10.10 पर --skip-alias@SiegeX द्वारा उल्लिखित रूप में समझ में नहीं आता है , उदाहरण के लिए।) typeआपकी कॉन्फिग फाइलों पर प्रहार के बजाय वर्तमान शेल वातावरण का उपयोग करता है, और उस वातावरण के कुछ हिस्सों को अनदेखा करने के लिए कहा जा सकता है, इसलिए यह आपको दिखाता है कि वास्तव में क्या होगा इसके बजाय अपने डिफ़ॉल्ट शेल के पुनर्निर्माण में क्या होगा।

इस मामले में, type -Pकिसी भी उपनाम या कार्य को बायपास करेगा:

$ type -P vim
/usr/bin/vim

आप इसे सभी परतों को छीलने के लिए भी कह सकते हैं , एक बार में, और आपको दिखाएगा कि यह क्या मिलेगा:

$ type -a vim
vim is aliased to `vim -X'
vim is /usr/bin/vim

(इस पर टिप्पणी से विस्तार :)

इसके साथ समस्या whichयह है कि यह आमतौर पर निर्मित शेल के बजाय एक बाहरी कार्यक्रम है, जिसका अर्थ है कि यह आपके उपनामों या कार्यों को नहीं देख सकता है और उन्हें शेल के स्टार्टअप / कॉन्फिग फाइलों से पुनर्निर्माण करने का प्रयास करना होगा। (यदि यह एक शेल निर्मित है, जैसा कि इसमें है, zshलेकिन bashयह स्पष्ट रूप से नहीं है , तो शेल के पर्यावरण का उपयोग करने और सही काम करने की संभावना अधिक है।)

typeएक POSIX अनुरूप आदेश जो व्यवहार करने के लिए के रूप में अगर यह थे आवश्यकता है एक अंतर्निहित (जो है, यह खोल यह स्थानीय उपनाम और कार्यों को शामिल करने से लागू है की पर्यावरण का उपयोग करना चाहिए), तो यह आम तौर पर है एक अंतर्निहित।

यह आम तौर पर csh/ में नहीं पाया जाता है tcsh, हालांकि उनमें से अधिकांश आधुनिक संस्करणों में whichएक शेल बिलिन है और सही काम करता है; कभी-कभी अंतर्निर्मित होता है what, और कभी-कभी वर्तमान शेल के वातावरण को csh/ से देखने के लिए कोई अच्छा तरीका नहीं होता है tcsh


6
धन्यवाद! यह ट्रिक्स के मेरे बैग में जोड़ने के लिए बहुत उपयोगी है। मुझे विशेष रूप से यह पसंद है कि आप सभी उदाहरणों type -aको वापस लौटाएं , न कि पहले वाले को। मुझे लगता है कि मैं उर्फ को :)$PATHwhichtype
एड्रियन पेट्रस्कु

2
@ geekosaur: धन्यवाद। यदि typeपोसिक्स मानक का हिस्सा है तो जाने का रास्ता है। मेरे प्रश्न का उत्तर देने के लिए, zsh पर भी काम करें (डेबियन पर)। वितरण से छुटकारा क्यों नहीं मिलता है whatऔर whichयदि वे मानकीकृत नहीं हैं और अतिरिक्त कार्यक्षमता नहीं है?
फहीम मीठा

1
नहीं, दूर से भी नहीं।
21

1
@ फहीम: पुन: प्रलेखन, मैं info bash 'Bash builtins'लिनक्स पर शुरू करूँगा , हालाँकि आप इसे zshसंदर्भ पुस्तिका भी बना सकते हैं । अधिक आधिकारिक तौर पर, pubs.opengroup.org/onlinepubs/009695399/utilities/type.html (जो मैं ध्यान दें वास्तव में विशिष्ट जानकारी नहीं है -Pया -a, या यहाँ तक कि -pजो मूल रूप से था -P, लेकिन वह यह वर्तमान खोल वातावरण का उपयोग की आवश्यकता होती है)।
geekosaur

2
type -pज़श और बैश के बीच अलग तरह से व्यवहार करता है। type -Pzsh में बिल्कुल मौजूद नहीं है।
कोजिरो

15

इन bash:

type -P vim

इन zsh:

type -p vim

दोनों मे:

/usr/bin/which vim

या:

( unalias vim; type vim )

2
पिछले एक शांत है। हमारे पास ऐसा करने के लिए एक उपनाम हो सकता है। :)
बाल्की

लाल पर बैश में मुझे टाइप -२ का उपयोग करना है, और जो नहीं, अगर मुझे सही उत्तर चाहिए। कोई उपनाम या कार्य चिंतित नहीं हैं।

डॉ। एवल, जो "कौन सा" है? कौन सी रेड हैट?
मिकेल

@ मिकेल आरएच 7.4। GNU जो v2.20।

4

Zsh whichमें एक कमांड है जो इस कमांड की रिपोर्ट करता है:

$ whence -w which
which: builtin

बाहरी कमांड निष्पादित करने के लिए (किसी भी शेल में) which, पूर्ण पथ का उपयोग करें :

$ /bin/which ls; echo $?
/bin/ls
0

इस प्रकार आदेश lsमिला (0 का एक निकास मान), और पर स्थित है /bin/ls

अंदर zsh; बाहरी आदेशों को खोजने के लिए एक तरीका (ऊपर वाले के बगल में) है:

$ whence -p ls
/bin/ls

हालाँकि, यह नेस्टेड उपनामों को हल नहीं करेगा:

$ alias dire='ls -l'

कमांड रिपोर्ट करेगा कि कोई direकमांड नहीं मिली।

$ whence -p dire; echo $?
1

नेस्टेड अलाइसेस (मैन्युअल रूप से) को देखने के लिए Resolve nested aliases to their source commands


2

मेरा इस तरह परिभाषित किया

alias which='alias | /usr/bin/which --tty-only --read-alias --show-dot --show-tilde'

1

निम्नलिखित आज़माएँ:

which --skip-alias vim

1
दिलचस्प! यह बैश पर काम करता है, लेकिन ज़श पर नहीं (मुझे वास्तव में नहीं लगा कि यह शेल-डिपेंडेंट होने वाला है)। इससे मुझे एहसास हुआ कि whichवास्तव में एक शेल निर्मित है और एक नियमित यूनिक्स उपयोगिता नहीं है जैसा कि मैंने ग्रहण किया था। इसलिए मुझे अपने प्रश्न को संपादित करना चाहिए और Zsh को निर्दिष्ट करना चाहिए। यह मुझे इंगित करने के लिए धन्यवाद!
एड्रियन पेट्रसेकू

whichएक बिलिन नहीं है, कम से कम डेबियन पर नहीं। यह एक शेल स्क्रिप्ट है, और डेबियनूटिल्स का हिस्सा है, इसलिए ज़श पर काम करता है। हालांकि, डेबियन पर --skip-aliasएक विकल्प नहीं है which। क्या whichघूमने की अलग-अलग किस्में हैं ? यह एक मानकीकृत आदेश होने की अपील नहीं करता है।
फहीम मीठा

@ फहीम मीठा: यह एक ज़िश बिलिन है। देखते हैं man zshbuiltinsजिसे [-wpams] नाम ... समतुल्यता के लिए -c।
मिकेल

Xubuntu के हाँ पर bash, यह बिल्ट-इन नहीं है और इसका --skip-aliasविकल्प नहीं है ।
पॉलीम जूल

CentOS (और RHEL?) 6 पर, यह एक निष्पादन योग्य /usr/bin/whichप्लस है जिसमें एक उपनाम है /etc/profile.dजो इसे उपनामों को संभालने देता है लेकिन --skip-aliasकाम करता है। नतीजतन which which, उपनाम दिखाता है, लेकिन command which whichनिष्पादन योग्य दिखाता है!
dave_thompson_085


0

दोनों typeऔर whichअपने खोल प्रकार के अनुसार अलग ढंग से व्यवहार।

बैश में, whichएक कमांड में मौजूद है PATH। यह आपके द्वारा प्रदान की गई कमांड को खोजता है PATH। बैश बिलिन type -P(पी फॉर PATH) बिल्कुल वैसा ही व्यवहार करता है which

ZSH में, दोनों whichऔर typebuiltins, और builtin का आंशिक कार्य हैं whencewhich -pतुम क्या चाहते हो यह एक पथ खोज को बाध्य करता है। ( -Pविकल्प typeZSH के लिए उपलब्ध नहीं है ।)

whence [-vcwfpamsS] [-x num] नाम ...

-p

नाम के लिए एक पथ खोज करें, भले ही वह एक उपनाम, आरक्षित शब्द, शेल फ़ंक्शन या बिलिन हो।

ZSH मैनुअल से अधिक।

जो [-wpamsS] [-x num] नाम ...

जहाँ-तहाँ के बराबर।

ZSH से builtin whichकमांड को छोड़ना और प्रयोग करनाwhichPATH

alias which="command which"
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.