क्या "cd" कमांड में निर्मित कमांड लाइन को ओवरराइड करना संभव है?


22

बस हर बार मैं अपनी मशीन पर एक अलग निर्देशिका में 'सीडी' (इस मामले में, मैक ओएस एक्स 10.6.7) कमांड लाइन (जो कि बैश है) के माध्यम से, मैं तुरंत सामग्री की सूची प्राप्त करने के लिए 'ls' टाइप करता हूं। उस निर्देशिका में। मैं 'cd' को ओवरराइड करने का एक तरीका निकालने की कोशिश कर रहा हूं ताकि यह अनुरोधित निर्देशिका में बदल जाए और फिर मुझे एक शॉट में सूची प्रदान करे।

मैं अपनी ~ / .bash_profile में जोड़ी गई मूल पंक्ति के साथ काम करने के लिए जो मूल कार्यशीलता देख रहा हूँ, उसे प्राप्त करने में सक्षम हूँ

function cl() { cd "$@"; ls -l; }

यह उम्मीद के मुताबिक काम करता है। अनुरोधित निर्देशिका में परिवर्तन करना और फिर मुझे सामग्री दिखाना। जहां मैं एक मुद्दे में दौड़ता हूं, वह एक नया "सीएल" कमांड बनाने के बजाय "सीडी" को ओवरराइड करने की कोशिश कर रहा है।

निम्नलिखित चीजें काम नहीं करती हैं

##### Attempt 1 #####
# Hangs the command line

function cd() { cd "$@"; ls -l; }


##### Attempt 2 #####
# Hangs the command line

function cd() { 'cd' "$@"; ls -l; }


##### Attempt 3 #####
# Does not change directory. 
# Does list contents, but of the directory where you started.

function cd() { /usr/bin/cd "$@"; ls -l; }


#### Other attempts that fail in various ways #####
alias cd=cd "$@"; ls -la;
alias cd="cd '$@'; ls -la;"
alias cd='cd "$@"'; ls -la;
alias cd=/usr/bin/cd "$@"; ls -la;

मैंने कई अन्य पुनरावृत्तियों की भी कोशिश की, जो एक उपनाम बनाने के साथ-साथ काम करने वाले 'cl' फ़ंक्शन की ओर भी सूचीबद्ध नहीं हैं। जिसमें से कोई भी काम नहीं किया।

मैंने प्रलेखन में इस तथ्य के बारे में बात की है कि 'सीडी' को एक बाहरी कमांड के रूप में नहीं चलाया जा सकता है (जो कि मुझे समझ में आता है कि फ़ंक्शन को इसका उपयोग करने की आवश्यकता होगी)।

इसलिए, मैं वर्तमान में अपने "cl" कमांड का उपयोग कर सकता हूं और जो मैं चाहता हूं वह प्राप्त कर सकता हूं, लेकिन सवाल यह है कि:

क्या 'सीडी' के व्यवहार को ओवरराइड करने का एक तरीका है कि इसे अनुरोधित निर्देशिका में बदल दिया जाए और फिर बाद में कुछ और किया जाए?

जवाबों:


30

निम्नलिखित काम करना चाहिए:

function cd() { builtin cd "$@" && ls -l; }

चूंकि फ़ंक्शन एक ही लाइन पर है, इसलिए यह सुनिश्चित करें कि यह ;सही ढंग से काम करने के लिए ऊपर के साथ समाप्त हो गया है।


एक पैरामीटर रहित कॉल के लिए काम नहीं करता है।
डैनियल बेक

3
@DanielBeck - कम से कम मेरे मैक OSX (10.6.7) पर यह एक पैरामीटर रहित कॉल के साथ ठीक काम कर रहा है। व्यवहार यह है कि यह होम डायरेक्टरी में बदल जाता है और फिर उस डायर की सूची बनाता है। अंत में जोड़े गए नई सुविधा के साथ सादे-पुराने 'सीडी' की कार्यक्षमता को प्रभावी ढंग से दोहराते हुए।
एलन डब्ल्यू। स्मिथ

2
@ एलन सच, मैंने परीक्षण किया कि उस कोड को शेल में लिखकर। यह के व्यवहार लगता है cd ""(क्या इस उत्तर का मूल्यांकन करना चाहिए से अलग है को cd "$@"खाली साथ $@भ्रम की स्थिति के बारे में क्षमा
डैनियल बेक

@ डैनियलबेक - कोई चिंता नहीं।
एलन डब्ल्यू। स्मिथ

2
नोट: मैं इसे स्वीकृत उत्तर में बदल रहा हूं क्योंकि यह प्रश्न का सटीक उत्तर है। प्रिंसिपल को संबोधित करने के लिए @RichHomolka एक है, लेकिन यह वही है जो आपकी ~ / .bash_profile फ़ाइल में डाला जा सकता है।
एलन डब्ल्यू। स्मिथ

10

मुझे लगता है कि आप एक लूप में चल रहे हैं। आपका cdफ़ंक्शन कॉल कर रहा है cd, जो ... फ़ंक्शन है।

आपको यह जानना होगा कि builtinकौन सा एक कीवर्ड है जो कमांड लुकअप को सीडी की तरह बैश बिल्डिंस का उपयोग करता है न कि आपके फंक्शन के लिए

function cd
{
    builtin cd "$1"
    : do something else
}

इसके अलावा, कॉलिंग /usr/bin/cdकभी भी काम नहीं करेगी, भले ही ऐसी कोई कमांड मौजूद हो।

क्या हुआ होगा:

  • मेरा बैश शेल दिर में है /bash/dir
  • मैं एक कमांड चलाता हूं /usr/bin/cd /dir/for/cd
  • /usr/bin/cddir जाता है /dir/for/cd
  • /usr/bin/cd बाहर निकलता है।
  • बैश अभी भी है /bash/dir, क्योंकि बच्चे की प्रक्रिया /usr/bin/cdमाता-पिता को प्रभावित नहीं कर सकती है।

इसके अलावा उपनाम सरल पाठ प्रतिस्थापन हैं। उनके पास कभी पैरामीटर नहीं हो सकते।


मैं सुझाव देता हूं builtin cd $@ && ls; चूंकि cdकॉल को बाकी चीजों के लिए सफल होना चाहिए। इसके अलावा, विशेष मामलों को याद रखें जैसे cd(कोई तर्क नहीं)।
डैनियल बेक

साइड नोट: मैंने इसे स्वीकृत उत्तर के रूप में चिह्नित करने की कोशिश की, लेकिन यह बता रहा है कि मुझे ऐसा करने से पहले एक और 6 मिनट इंतजार करना होगा। इससे पहले कि आप ऐसा कर सकते हैं पता नहीं था कि देरी में बनाया गया था।
एलन डब्ल्यू। स्मिथ

@ एक और, बेहतर समाधान एक बहुत ही उचित समय सीमा में आ सकता है (यानी उन कुछ मिनटों के लिए आपको इंतजार करना होगा)। मुझे लगता है कि इसीलिए एक प्रणाली अनिवार्य विलंबित है: आपको गति से अधिक गुणवत्ता पसंद करनी चाहिए। यह बहुत ज्यादा असुविधा नहीं होनी चाहिए।
डैनियल बेक

और हमारे पास एक विजेता है। यह एक विजेता की तरह काम करता है। @DanielBeck के अनुसार, मैंने इसका उपयोग करने के लिए && को बदल दिया और इसे एक पंक्ति में संघनित किया: फ़ंक्शन cd {buildin cd "$ @" && ls -l; }
एलन डब्ल्यू। स्मिथ

@DanielBeck - हाँ, मैं इसके बारे में चिंतित नहीं हूँ। पहले कभी इस पर ध्यान नहीं दिया। मैं इसमें तर्क देख सकता हूं, बस मुझे थोड़ा आश्चर्य हुआ।
एलन डब्ल्यू। स्मिथ

6

मेरा सुझाव है कि सीडी को ओवरराइड न करें क्योंकि 'सीडी' फ़ंक्शन को अपहृत करने वाली कुछ अन्य लिपियाँ हैं, उदाहरण के लिए, आरवीएम। एक और नाम चुनना बेहतर होगा, जैसे 'घ', इसके बजाय और अपने कार्य में 'बिलिन' प्रकार निर्दिष्ट न करें; अन्यथा, अपहरणकर्ता काम नहीं करेगा। मैं नीचे दिए गए कोड का उपयोग कर रहा हूं:

function d() { cd "$@" && ls;} 

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