ดูเหมือนว่าเมื่อเพิ่มไดเรกทอรีลงใน $ PATH ไดเรกทอรีย่อยจะไม่ถูกเพิ่มซ้ำ ฉันจะทำอย่างนั้นได้ไหม? หรือมีเหตุผลว่าทำไมถึงไม่รองรับ
ดูเหมือนว่าเมื่อเพิ่มไดเรกทอรีลงใน $ PATH ไดเรกทอรีย่อยจะไม่ถูกเพิ่มซ้ำ ฉันจะทำอย่างนั้นได้ไหม? หรือมีเหตุผลว่าทำไมถึงไม่รองรับ
คำตอบ:
เพิ่มพวกเขาซ้ำโดยใช้ find ดังนี้:
PATH=$PATH$( find $HOME/scripts/ -type d -printf ":%p" )
คำเตือน: ดังที่ได้กล่าวไว้ในความคิดเห็นเกี่ยวกับคำถามซึ่งไม่ได้รับการสนับสนุนเนื่องจากมีความเสี่ยงด้านความปลอดภัยเนื่องจากไม่มีการรับประกันว่าไฟล์ที่ใช้งานได้ในไดเรกทอรีที่เพิ่มเข้ามาจะไม่เป็นอันตราย
มันอาจเป็นทางออกที่ดีกว่าในการทำตามคำตอบของ Gilles และใช้stow
$PATH
เป็นอันตราย แต่การเพิ่มไดเรกทอรีย่อยนั้นไม่ได้มีความโดดเด่น แต่มักจะไร้ประโยชน์และอาจไม่มีประสิทธิภาพ (และอาจทำให้คุณ จำกัด ขนาดของสภาพแวดล้อมในบางครั้ง)
~/bin
หรือ~/scripts
) ดังนั้นความปลอดภัยของพวกเขาจึงเหมือนกัน
~/scripts
ความเสี่ยงด้านความปลอดภัยถ้าคุณทำงานในสภาพแวดล้อมที่คนสุ่มสามารถเพิ่มไฟล์ที่เป็นอันตรายของคุณ ฉันไม่ควรและไม่ควรให้ใครอื่น
โครงสร้างไดเร็กทอรี unix ปกติมีไฟล์แอ็พพลิเคชันที่เรียงลำดับเป็นไดเร็กทอรีตามชนิด: bin
สำหรับไฟล์เรียกทำงานlib
สำหรับไลบรารีdoc
สำหรับเอกสารและอื่น ๆ นั่นคือเมื่อพวกเขาติดตั้งในไดเรกทอรีที่แยกต่างหาก บ่อยครั้งที่แอปพลิเคชันถูกจัดกลุ่มเป็นไดเรกทอรีน้อย (ดังนั้นระบบจำนวนมากมีเพียงสามไดเรกทอรีใน$PATH
: /usr/local/bin
, /usr/bin
และ/bin
) $PATH
มันเป็นเรื่องยากที่จะมีทั้งไฟล์ปฏิบัติการและไดเรกทอรีย่อยภายในไดเรกทอรีจึงมีความต้องการรวมทั้งไดเรกทอรีย่อยของไดเรกทอรีในไม่มี
สิ่งที่อาจมีประโยชน์ในบางครั้งคือการรวมbin
ไดเรกทอรีย่อยทั้งหมดของไดเรกทอรีย่อยของไดเรกทอรีที่ระบุใน$PATH
:
for d in /opt/*/bin; do PATH="$PATH:$d"; done
อย่างไรก็ตามสิ่งนี้ทำไม่ค่อย วิธีการปกติเมื่อ executables ในไดเรกทอรีที่ไม่ได้มาตรฐานจะเป็นในการที่จะทำให้การเชื่อมโยงสัญลักษณ์ในไดเรกทอรีในเส้นทางเช่น$PATH
ยูทิลิตี้ (หรือ) จะมีประโยชน์ในเรื่องที่/usr/local/bin
stow
xstow
เหตุผลหนึ่งที่ไม่รองรับนี้คือเนื่องจากไดเรกทอรี bin / (และคล้ายกัน) ใช้ลิงก์สัญลักษณ์เพื่อชี้ไปยังไดเรกทอรีเฉพาะที่ติดตั้งโปรแกรมปฏิบัติการจริงสำหรับโปรแกรม
ดังนั้นหากคุณ$PATH
รวม/usr/local/bin
(ซึ่งเป็นไปได้มากที่สุด) โฟลเดอร์นั้นเต็มไปด้วยลิงก์สัญลักษณ์ (เช่นruby
) ซึ่งชี้ไปที่ไดเรกทอรีเฉพาะที่พบรหัสเพื่อเรียกใช้ทับทิม (เช่น../Cellar/ruby/2.1.3/bin/ruby
)
นี่คือเหตุผลที่คุณไม่ได้มีการระบุแต่ละโฟลเดอร์ที่ปฏิบัติการในของคุณ$PATH
; ลิงก์สัญลักษณ์ที่พบตามปกติในไดเร็กทอรี bin / type จัดการกับคุณ