เป็นวิธีที่ดีที่สุดในการรันสคริปต์เมื่อเข้าสู่ไดเรกทอรีอะไร
เมื่อฉันย้ายไปยังไดเรกทอรีใหม่ฉันต้องการทุบตีเพื่อเรียกใช้สคริปต์ projectSettings.bash เหมือนที่ RVM ทำ
เป็นวิธีที่ดีที่สุดในการรันสคริปต์เมื่อเข้าสู่ไดเรกทอรีอะไร
เมื่อฉันย้ายไปยังไดเรกทอรีใหม่ฉันต้องการทุบตีเพื่อเรียกใช้สคริปต์ projectSettings.bash เหมือนที่ RVM ทำ
คำตอบ:
คุณสามารถสร้าง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