2010-07-29 15 views
16

जब मैं कोई नई निर्देशिका दर्ज करता हूं तो मैं एक विशेष बैश फ़ंक्शन निष्पादित करना चाहता हूं। Somethink चाहते:निर्देशिका दर्ज करने पर एक bash फ़ंक्शन निष्पादित करें

alias cd="cd [email protected] && myfunction" 

[email protected] वहाँ काम नहीं करता है, और एक बैकस्लैश जोड़ने में मदद नहीं करता। मैं सीडी के साथ गड़बड़ करने के बारे में भी चिंतित हूं, और यह अच्छा होगा अगर यह अन्य आदेशों के लिए काम करता है जो pushd और popd जैसे निर्देशिका को बदलता है।

कोई बेहतर उपनाम/आदेश?

उत्तर

17

सबसे आसान समाधान मैं के साथ आ सकते हैं इस

myfunction() { 
    if [ "$PWD" != "$MYOLDPWD" ]; then 
    MYOLDPWD="$PWD"; 
    # strut yer stuff here.. 
    fi 
} 

export PROMPT_COMMAND=myfunction 

है कि यह करना चाहिए। यह सभी आदेशों के साथ काम करेगा, और संकेत प्रदर्शित होने से पहले ट्रिगर हो जाएगा।

+1

का समर्थन बस 'printf "\ e] 1; $ PWD \ a" 'और bam (!) जोड़ें, टैब नाम को pwd में बदल दिया गया है। – Fadi

+0

@ फ़ैडी सच होने पर, अधिकांश लोग केवल इसके लिए प्रॉम्प्ट पर एक एस्केप अनुक्रम जोड़ते हैं, यह वास्तव में कोई फर्क नहीं पड़ता कि यह प्रत्येक प्रॉम्प्ट के साथ अपडेट हो जाता है (केवल निर्देशिकाओं को बदलने के बजाए), क्योंकि यह उल्लेखनीय नहीं होगा। – falstro

2

मैंने लिखा है कि एक ZSH स्क्रिप्ट स्रोत परियोजना विशिष्ट ZSH कॉन्फ़िगरेशन के लिए कॉलबैक फ़ंक्शन chpwd का उपयोग करती है। मुझे यकीन नहीं है कि यह बैश के साथ काम करता है, लेकिन मुझे लगता है कि यह एक कोशिश के लायक होगा। यदि आपको उस निर्देशिका में कोई स्क्रिप्ट फ़ाइल नहीं मिलती है जिसमें आप सीडीइंग कर रहे हैं, तो यह तब तक मूल निर्देशिकाओं की जांच करेगा जब तक कि इसे स्रोत पर स्क्रिप्ट नहीं मिलती (या जब तक यह / तक पहुंच न जाए)। यह निर्देशिका से बाहर होने पर unmagic फ़ंक्शन भी कॉल करता है, जो आपको प्रोजेक्ट छोड़ते समय अपने पर्यावरण को साफ करने की अनुमति देता है। एक "जादू" स्क्रिप्ट के लिए

http://github.com/jkramer/home/blob/master/.zsh/func/magic

उदाहरण:

export BASE=$PWD # needed for another script of mine that allows you to cd into the projects base directory by pressing ^b 

ctags -R --languages=Perl $PWD # update ctags file when entering the project directory 

export PERL5LIB="$BASE/lib" 

# function that starts the catalyst server 
function srv { 
    perl $BASE/script/${PROJECT_NAME}_server.pl 
} 

# clean up 
function unmagic { 
    unfunction src 
    unset PERL5LIB 
} 
+0

ऐसा प्रतीत नहीं होता है। –

16

उपनाम पैरामीटर स्वीकार नहीं करता। आपको एक फ़ंक्शन का उपयोग करना चाहिए। प्रॉम्प्ट जारी होने पर हर बार इसे स्वचालित रूप से निष्पादित करने की आवश्यकता नहीं होती है।

function cd() { builtin cd "[email protected]" && myfunction; } 

builtin कीवर्ड आप को फिर से परिभाषित करने के लिए एक बैश एक प्रत्यावर्तन बनाए बिना builtin अनुमति देता है। पैरामीटर को उद्धृत करने से यह निर्देशिका नामों में रिक्त स्थान होने पर कार्य करता है।

Bash docs कहते हैं:

लगभग हर प्रयोजन के लिए, खोल कार्यों उपनाम से अधिक पसंद कर रहे हैं।

+0

इसमें पुशड, पॉपड इत्यादि के बारे में उनकी चिंता शामिल नहीं है; और हर मामले के लिए एक समारोह बनाने से यह एक कमांड कमांड से शायद अधिक जटिल बनाता है। – falstro

6

इस के कुछ अन्य संस्करणों सहित

  • smartcd, जो मैंने लिखा सारे हैं, और templating और अस्थायी चर
  • ondir है, जो छोटा होता है बचत सहित सुविधाओं की एक टन है और बहुत सरल

इन दोनों दोनों बैश और zsh

+0

ओह, मैन, वह स्मार्टकडी स्वादिष्ट लग रहा है! – mihai

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