ฉันจะตั้งค่าไดเรกทอรีย่อยทั้งหมดของไดเรกทอรีเป็น $ PATH ได้อย่างไร


38

ดูเหมือนว่าเมื่อเพิ่มไดเรกทอรีลงใน $ PATH ไดเรกทอรีย่อยจะไม่ถูกเพิ่มซ้ำ ฉันจะทำอย่างนั้นได้ไหม? หรือมีเหตุผลว่าทำไมถึงไม่รองรับ


5
ทำไมคุณถึงต้องการบนโลกใบนี้?
alex

10
@alex: ทำไมคุณคิดว่าไม่จำเป็น
ทิม

4
@ ถึงสาเหตุที่ไม่สนับสนุน "โดยทั่วไป" เป็นความเสี่ยงด้านความปลอดภัยและโดยทั่วไปไม่จำเป็นต้องใช้ หากคุณเพิ่มไดเรกทอรีซ้ำในเส้นทางของคุณที่รู้ว่ามีอะไรติดอยู่ในนั้น ... ทำให้การตรวจสอบทำได้ยากยิ่งขึ้น
xenoterracide

4
@Tim: มันเป็นสิ่งที่แปลกและแปลกประหลาดจริงๆที่ต้องการนั่นคือเหตุผล
alex

8
@alex เกี่ยวกับไดเรกทอรีย่อยในไดเรกทอรี bin หรือไม่ ฉันชอบที่จะจัดระเบียบสคริปต์ในไดเรกทอรีในโฟลเดอร์ถังขยะ
Andy

คำตอบ:


19

เพิ่มพวกเขาซ้ำโดยใช้ find ดังนี้:

PATH=$PATH$( find $HOME/scripts/ -type d -printf ":%p" )

คำเตือน: ดังที่ได้กล่าวไว้ในความคิดเห็นเกี่ยวกับคำถามซึ่งไม่ได้รับการสนับสนุนเนื่องจากมีความเสี่ยงด้านความปลอดภัยเนื่องจากไม่มีการรับประกันว่าไฟล์ที่ใช้งานได้ในไดเรกทอรีที่เพิ่มเข้ามาจะไม่เป็นอันตราย

มันอาจเป็นทางออกที่ดีกว่าในการทำตามคำตอบของ Gilles และใช้stow


6
คำเตือน: คำตอบนี้ถูกต้องทางเทคนิค แต่เป็น alex และ xenoterracide โปรดทราบว่านี่เป็นสิ่งที่ไม่ปลอดภัยและคุณควรคิดอย่างรอบคอบก่อนที่จะใช้สิ่งนี้
Caleb

2
โปรดเพิ่มคำเตือนให้กับคำตอบของคุณเกี่ยวกับสาเหตุที่สิ่งนี้ไม่ดีและปลอดภัยในการปฏิบัติ
Caleb

3
ฉันจะไม่พิจารณาโดยเฉพาะอย่างยิ่งเป็นอันตราย ; การเพิ่มไดเรกทอรีแบบสุ่ม$PATHเป็นอันตราย แต่การเพิ่มไดเรกทอรีย่อยนั้นไม่ได้มีความโดดเด่น แต่มักจะไร้ประโยชน์และอาจไม่มีประสิทธิภาพ (และอาจทำให้คุณ จำกัด ขนาดของสภาพแวดล้อมในบางครั้ง)
Gilles 'หยุดความชั่วร้าย'

3
@Caleb: อาจบ้า แต่ทำไมไม่ปลอดภัย? หากใครบางคนมีสิทธิ์เข้าถึงเพื่อเพิ่มไฟล์ปฏิบัติการที่เป็นอันตรายในส่วนย่อยเขาสามารถเพิ่มไฟล์เหล่านั้นไปยังผู้ปกครองหลัก (เช่น~/binหรือ~/scripts) ดังนั้นความปลอดภัยของพวกเขาจึงเหมือนกัน
MestreLion

2
~/scriptsความเสี่ยงด้านความปลอดภัยถ้าคุณทำงานในสภาพแวดล้อมที่คนสุ่มสามารถเพิ่มไฟล์ที่เป็นอันตรายของคุณ ฉันไม่ควรและไม่ควรให้ใครอื่น
oseiskar

21

โครงสร้างไดเร็กทอรี 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/binstowxstow


4

เหตุผลหนึ่งที่ไม่รองรับนี้คือเนื่องจากไดเรกทอรี bin / (และคล้ายกัน) ใช้ลิงก์สัญลักษณ์เพื่อชี้ไปยังไดเรกทอรีเฉพาะที่ติดตั้งโปรแกรมปฏิบัติการจริงสำหรับโปรแกรม

ดังนั้นหากคุณ$PATHรวม/usr/local/bin(ซึ่งเป็นไปได้มากที่สุด) โฟลเดอร์นั้นเต็มไปด้วยลิงก์สัญลักษณ์ (เช่นruby) ซึ่งชี้ไปที่ไดเรกทอรีเฉพาะที่พบรหัสเพื่อเรียกใช้ทับทิม (เช่น../Cellar/ruby/2.1.3/bin/ruby)

นี่คือเหตุผลที่คุณไม่ได้มีการระบุแต่ละโฟลเดอร์ที่ปฏิบัติการในของคุณ$PATH; ลิงก์สัญลักษณ์ที่พบตามปกติในไดเร็กทอรี bin / type จัดการกับคุณ

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