ดำเนินการทุบตีสคริปต์ในการเข้าสู่ไดเรกทอรี


40

เป็นวิธีที่ดีที่สุดในการรันสคริปต์เมื่อเข้าสู่ไดเรกทอรีอะไร
เมื่อฉันย้ายไปยังไดเรกทอรีใหม่ฉันต้องการทุบตีเพื่อเรียกใช้สคริปต์ projectSettings.bash เหมือนที่ RVM ทำ


2
ในทุก ๆ ไดเรกทอรีหรือที่เลือกไว้? และสคริปต์เดียวกันสำหรับแต่ละหรือไม่
enzotib

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

3
ฉันผิดอย่างสมบูรณ์และขอโทษ RVM โหลดซีดีมากเกินไป
MageProspero

5
(ลบบางสิ่งบางอย่าง pro / anti-Ruby tangential ออกจากชุดความคิดเห็นนี้)
Michael Mrozek

1
ใน projectSettings.bash ฉันแนะนำให้คุณเพิ่มตัวแปรการตั้งค่าสถานะเพื่อไม่ให้เริ่มต้นซ้ำในกรณีที่คุณออกจาก / ป้อนไดเรกทอรีอีกครั้ง if [ -z $MYSETTINGS ] ; then export MYSETTINGS=1 ; echo your settings here ; fiทุกอย่างเพื่อให้แนบใน นี่คือเพื่อหลีกเลี่ยงปัญหาในกรณีที่คุณทำบางสิ่งบางอย่าง PATH = / mytools / bin: $ PATH ชนิดของการเริ่มต้น
spider

5
@spider ค่อนข้างควรมีกลไก unset บางอย่างถ้าคุณออกจากไดเรกทอรี หากคุณออกไปและกลับเข้ามาอีกครั้งคุณควรกลับสู่การตั้งค่า!
Gilles 'หยุดความชั่วร้าย'

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
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.