निर्देशिका में प्रवेश करने पर बैश स्क्रिप्ट निष्पादित करें


40

निर्देशिका में प्रवेश करते समय स्क्रिप्ट निष्पादित करने का सबसे अच्छा तरीका क्या है?
जब मैं एक नई निर्देशिका में जाता हूं, तो मैं प्रोजेक्ट को सेट करने के लिए बैश करना चाहता हूं। जैसे स्क्रिप्ट आरवीएम करता है।


2
हर निर्देशिका में, या चुने हुए लोग? और प्रत्येक के लिए एक ही स्क्रिप्ट, या नहीं?
enzotib

हर निर्देशिका। निर्देशिका में स्क्रिप्ट का नाम ProjectSettings.bash यदि यह मौजूद है।
19पेज पर MageProspero

जवाबों:


46

आप कर सकते हैं cdएक समारोह (और popऔर pushd), और यह पता लगाने अगर आप उस विशेष निर्देशिका दर्ज करें।

cd () { builtin cd "$@" && chpwd; }
pushd () { builtin pushd "$@" && chpwd; }
popd () { builtin popd "$@" && chpwd; }
unset_all_project_settings () {
  # do whatever it takes to undo the effect of projectSettings.bash,
  # e.g. unset variables, remove PATH elements, etc.
}
chpwd () {
  case $PWD in
    /some/directory|/some/other/directory) . ./projectSettings.bash;;
    *) unset_all_project_settings;;
  esac
}

निर्देशिकाओं में ऐसा न करें कि आपने श्वेत नहीं किया है, क्योंकि इससे किसी के लिए आपको मनमाने कोड चलाने में बहुत आसानी होगी - आपको एक संग्रह भेजना है, इसलिए आप इसे अनज़िप करें, इसे बनाई गई निर्देशिका में बदलें, और आप ' अब हमलावर का कोड चलाते हैं।

मैं इस दृष्टिकोण की अनुशंसा नहीं करता, क्योंकि इसका मतलब है कि स्क्रिप्ट निष्पादित की जाएगी भले ही आप उस निर्देशिका में किसी कारण से प्रवेश करें जो परियोजना पर काम करने के लिए असंबंधित है। मेरा सुझाव है कि एक विशिष्ट फ़ंक्शन है जो प्रोजेक्ट निर्देशिका में बदलता है और सेटिंग्स स्क्रिप्ट को स्रोत बनाता है।

myproj () {
  cd /some/directory && . ./projectSettings.bash
}

1
मैंने केवल थोड़ी देर पहले रूबी में शुरू किया था। आरवीएम टूल थू पूरी तरह से बैश में है और बैश मैजिक के सबसे अच्छे टुकड़ों में से एक मैंने देखा है। मुझे लगता है कि जवाब थोड़ा मूर्खतापूर्ण है क्योंकि एक सबसे खराब चीज जो आप कभी भी कर सकते हैं, वह है जैसे कुछ पर सवारी करना cdऔर संदेह के साथ एक बेहतर तरीका है। $ PROMPT_COMMAND का उपयोग करना भी बेहतर है!
MageProspero

3
मैं पूरी तरह से गलत था और माफी मांगता हूं। RVM सीडी को ओवरलोड कर रहा था।
MageProspero

5
(यह टिप्पणी थ्रेड से कुछ स्पर्शरेखा समर्थक / विरोधी रूबी सामान निकाला गया)
माइकल Mrozek

1
ProjectSettings.bash में मैं सुझाव देता हूं कि आप निर्देशिका से बाहर निकलने / फिर से प्रवेश करने की स्थिति में पुनरावृत्ति को न दोहराने के लिए एक ध्वज चर जोड़ें। इसलिए हर चीज को अंदर करो if [ -z $MYSETTINGS ] ; then export MYSETTINGS=1 ; echo your settings here ; fi। यदि आप PATH = / mytools / bin: $ PATH तरह के आरंभीकरण के मामले में समस्याओं से बचते हैं।
मकड़ी १

5
यदि आप निर्देशिका छोड़ते हैं तो @ राइडर को किसी प्रकार का परेशान तंत्र होना चाहिए। यदि आप छोड़ते हैं और पुनर्मिलन करते हैं, तो आपको सेटिंग्स वापस मिलनी चाहिए!
गिल्स एसओ- बुराई को रोकें '

0

direnv वह हो सकता है जिसे आप ढूंढ रहे हैं।

यहाँ एक उदाहरण आधिकारिक दस्तावेज से लिया गया है:

$ cd ~/my_project
$ echo ${FOO-nope}
nope
$ echo export FOO=foo > .envrc
.envrc is not allowed
$ direnv allow .
direnv: reloading
direnv: loading .envrc
direnv export: +FOO
$ echo ${FOO-nope}
foo
$ cd ..
direnv: unloading
direnv export: ~PATH
$ echo ${FOO-nope}
nope
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.