2012-04-05 14 views
5


आम तौर पर मैं .bashrc में निर्देशिका विशिष्ट सेटिंग्स रखता हूं और जब भी मैं निर्देशिका को बदलता हूं तो उन सेटिंग्स को प्रभावी बनाने के लिए source .bashrc कमांड निष्पादित करता है।
अब मैं ~/.bashrc में सीडी कमांड में हेरफेर करने की सोच रहा था, इसलिए जब भी मैं नई निर्देशिका में सीडी करता हूं और यदि कोई है। Bashrc वहां मौजूद है, तो यह स्वचालित रूप से लोड हो जाएगा।अनुकूलन सीडी कमांड

इस cd $1; source .bashrc के समान (मैंने सत्यापित किया है कि $ 1 वैध पथ है), लेकिन समस्या सीडी शेल बीलिंग है, इसलिए यह एक रिकर्सिव लूप है (सीडी हमेशा संशोधित सीडी को इंगित करता है)। हमारे पास सीडी की एल्फ़ फ़ाइल नहीं है (जो आम तौर पर हमारे पास अन्य आदेशों जैसे स्किप या अन्य हैं)। तो मैं इसे कैसे प्राप्त कर सकता हूं? यदि shopt -s cdspell समर्थित है तो भी मुझे $ 1 के तर्क में सीडी वर्तनी पथ की आवश्यकता है।

+0

लोग इसे बंद क्यों कर रहे हैं? क्या यह किसी अन्य धागे के लिए डुप्लिकेट है, मुझे ऐसा नहीं लगता है। या 100K या 900K प्रतिष्ठा रखने वाले लोगों के जवाब देने का मौका नहीं मिला? – peeyush

उत्तर

6

आप "बिल्टिन" कमांड चाहते हैं;

निर्मित खोल-निर्मित [तर्क]

निर्दिष्ट खोल builtin निष्पादित, यह तर्क गुजर, और उसके बाहर निकलने का दर्जा वापस जाएँ। यह उपयोगी है जब किसी फ़ंक्शन को परिभाषित करता है जिसका नाम शेल बिल्टिन, फ़ंक्शन के भीतर बिल्टिन की कार्यक्षमता को बनाए रखने जैसा ही है। सीडी बिल्टिन आमतौर पर इस तरह से परिभाषित किया जाता है। वापसी स्थिति स्थिति गलत है यदि शैल-बिल्टिन एक शेल बिल्टिन कमांड नहीं है।

से: http://linux.die.net/man/1/bash

तो, आप की तरह कुछ हो सकता था (अपरीक्षित, एक बैश काम या तो नहीं है);

function cd() { 
    builtin cd $1 \ 
     && test -e .bashrc \ 
     && source .bashrc 
} 
+0

शांत :-)। (15 वर्णों की सीमा क्यों है?) – peeyush

+1

आपको '-e' से पहले' test' की आवश्यकता है। – l0b0

+0

धन्यवाद, इसे ठीक किया गया। –

0

आप इस कोशिश कर सकते:

function cdd(){ cd $1; if [ -e ./.bashrc ] ; then source ./.bashrc; fi; } 
alias cd = 'cdd' 
? 

इतना परीक्षण नहीं किया था, लेकिन।

+0

समस्या सीडी की इस नई परिभाषा के लिए रिकर्सिव कॉल समान है। – peeyush

+0

मैंने निम्न संस्करण में इसका परीक्षण किया है: फ़ंक्शन सीडी() { सीडी $ 1; यदि [-e ./.bashrc]; फिर गूंजें "हाय, वहां!"; फाई } उर्फ ​​सीडी = 'CDD' फिर शीघ्र> सीडी हाय, वहाँ – begemotv2718

1

RVM करता है:

$ type cd 
cd is a function 
cd() 
{ 
    if builtin cd "[email protected]"; then 
     [[ -n "${rvm_current_rvmrc:-}" && "$*" == "." ]] && rvm_current_rvmrc="" || true; 
     __rvm_do_with_env_before; 
     __rvm_project_rvmrc; 
     __rvm_after_cd; 
     __rvm_do_with_env_after; 
     return 0; 
    else 
     return $?; 
    fi 
} 

और हाँ, यह मेरा मशीन पर काम करता है। अनिवार्य रूप से, जैसा कि @RoryHunter ने कहा, builtin का उपयोग करें और यदि यह सफल होता है तो कुछ कोड चलाएं, या अगर यह विफल हो जाता है तो निकास कोड वापस कर दें।

2

आप direnv की जांच कर सकते हैं। https://github.com/zimbatm/direnv

+0

जब मैं direnv डिज़ाइन किया गया तो विशिष्ट लक्ष्यों में से एक था अंतर्निहित अंतर्निहित आदेशों से बचने के लिए RVM करता है (किया?)। इसके बजाय direnv निर्देशिका परिवर्तनों का पता लगाने के लिए bash में PROMPT_COMMAND जैसे खोल हुक पर निर्भर करता है। – zimbatm

संबंधित मुद्दे