निर्देशिका में प्रवेश करते समय स्क्रिप्ट निष्पादित करने का सबसे अच्छा तरीका क्या है?
जब मैं एक नई निर्देशिका में जाता हूं, तो मैं प्रोजेक्ट को सेट करने के लिए बैश करना चाहता हूं। जैसे स्क्रिप्ट आरवीएम करता है।
निर्देशिका में प्रवेश करते समय स्क्रिप्ट निष्पादित करने का सबसे अच्छा तरीका क्या है?
जब मैं एक नई निर्देशिका में जाता हूं, तो मैं प्रोजेक्ट को सेट करने के लिए बैश करना चाहता हूं। जैसे स्क्रिप्ट आरवीएम करता है।
जवाबों:
आप कर सकते हैं 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
}
cd
और संदेह के साथ एक बेहतर तरीका है। $ PROMPT_COMMAND का उपयोग करना भी बेहतर है!
if [ -z $MYSETTINGS ] ; then export MYSETTINGS=1 ; echo your settings here ; fi
। यदि आप PATH = / mytools / bin: $ PATH तरह के आरंभीकरण के मामले में समस्याओं से बचते हैं।
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