ডিরেক্টরিতে প্রবেশের সময় কোনও স্ক্রিপ্ট কার্যকর করার সর্বোত্তম উপায় কী?
যখন আমি একটি নতুন ডিরেক্টরিতে স্থানান্তরিত করি তখন আমি আরভিএমের মতো প্রজেক্টসেটিংস.বাশ স্ক্রিপ্টটি কার্যকর করতে বাশ চাই।
ডিরেক্টরিতে প্রবেশের সময় কোনও স্ক্রিপ্ট কার্যকর করার সর্বোত্তম উপায় কী?
যখন আমি একটি নতুন ডিরেক্টরিতে স্থানান্তরিত করি তখন আমি আরভিএমের মতো প্রজেক্টসেটিংস.বাশ স্ক্রিপ্টটি কার্যকর করতে বাশ চাই।
উত্তর:
আপনি 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 = / মাইটোলস / বিন: কিছু করার ক্ষেত্রে সমস্যা এড়ানোর জন্য এটি হ'ল: AT পথ এক ধরণের সূচনা।
ডিরেক্টরি আপনি যা খুঁজছেন তা হতে পারে।
অফিসিয়াল ডকুমেন্টেশন থেকে নেওয়া এখানে একটি উদাহরণ:
$ 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