เส้นทาง Linux วิธีระบุเส้นทางโฟลเดอร์ ตัวแปรสภาพแวดล้อม PATH การเพิ่มตัวแปรผู้ใช้และสภาพแวดล้อมระบบใน Linux

เมื่อคุณป้อนคำสั่งเข้าไป บรรทัดคำสั่งโดยพื้นฐานแล้วคุณกำลังบอกให้เชลล์รันไฟล์ปฏิบัติการด้วยชื่อที่กำหนด บน Linux สิ่งเหล่านี้ โปรแกรมปฏิบัติการเช่น ls, find, file และอื่นๆ มักจะอยู่ในไดเรกทอรีต่างๆ ในระบบของคุณ ไฟล์ใดๆ ที่มีสิทธิ์ปฏิบัติการซึ่งจัดเก็บไว้ในไดเร็กทอรีเหล่านี้สามารถเรียกใช้ได้จากทุกที่ ไดเร็กทอรีทั่วไปส่วนใหญ่ที่มีโปรแกรมปฏิบัติการคือ /bin, /sbin, /usr/sbin, /usr/local/bin และ /usr/local/sbin

แต่เชลล์รู้ได้อย่างไรว่าไดเร็กทอรีใดที่จะค้นหาโปรแกรมที่ปฏิบัติการได้หรือเชลล์ค้นหาตลอด ระบบไฟล์?

คำตอบนั้นง่าย เมื่อคุณออกคำสั่ง เชลล์จะค้นหาไดเร็กทอรีทั้งหมดที่ระบุในตัวแปร $PATH ของผู้ใช้เพื่อหาไฟล์ปฏิบัติการที่มีชื่อนั้น

บทความนี้จะแสดงวิธีเพิ่มไดเร็กทอรีให้กับตัวแปร $PATH ของระบบของคุณ

$PATH ใน Linux คืออะไร

ตัวแปรสภาพแวดล้อม $PATH คือรายการไดเร็กทอรีที่อยู่ในอาณานิคมซึ่งบอกเชลล์ว่าไดเร็กทอรีใดที่จะค้นหาไฟล์ปฏิบัติการ

หากต้องการตรวจสอบว่าคุณมีไดเร็กทอรีใดในตัวแปร $PATH คุณสามารถใช้คำสั่ง printenv หรือ echo:

ก้อง $PATH

ผลลัพธ์จะมีลักษณะดังนี้:

/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin

หากคุณมีไฟล์ปฏิบัติการสองไฟล์ที่มีชื่อเดียวกันอยู่ในสองไดเร็กทอรีที่แตกต่างกัน เชลล์จะรันไฟล์ที่อยู่ในไดเร็กทอรีที่มาก่อนใน $PATH

การเพิ่มไดเรกทอรีให้กับ $PATH ของคุณ

มีสถานการณ์ที่คุณอาจต้องการเพิ่มไดเรกทอรีอื่นให้กับตัวแปร $PATH ของคุณ ตัวอย่างเช่น บางโปรแกรมอาจถูกติดตั้งในตำแหน่งที่แตกต่างกัน หรือคุณอาจต้องการมีไดเรกทอรีเฉพาะสำหรับรายการส่วนตัวของคุณ แต่สามารถเรียกใช้ได้โดยไม่ต้องระบุเส้นทางที่แน่นอนไปยังไฟล์ปฏิบัติการ ในการดำเนินการนี้ คุณเพียงแค่ต้องเพิ่มไดเร็กทอรีลงใน $PATH ของคุณ

สมมติว่าคุณมีไดเร็กทอรีชื่อ bin อยู่ในไดเร็กทอรีหลักของคุณซึ่งคุณเก็บเชลล์สคริปต์ไว้ วิธีเพิ่มไดเร็กทอรีให้กับตัวแปร $PATH ของคุณ:

คำสั่งส่งออกจะส่งออกตัวแปรที่แก้ไขไปยังสภาพแวดล้อมลูกของกระบวนการเชลล์

ตอนนี้คุณสามารถรันสคริปต์ของคุณได้โดยเพียงแค่พิมพ์ชื่อของสคริปต์ปฏิบัติการโดยไม่ต้องระบุเส้นทางแบบเต็มไปยังไฟล์ปฏิบัติการ

อย่างไรก็ตาม การเปลี่ยนแปลงนี้เป็นการเปลี่ยนแปลงชั่วคราวและมีผลกับเซสชันเชลล์ปัจจุบันเท่านั้น

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

  • ไฟล์คอนฟิกูเรชันเชลล์โกลบอล เช่น /etc/environment และ /etc/profile ใช้ไฟล์นี้หากคุณต้องการเพิ่มไดเร็กทอรีใหม่ให้กับทุกคน ผู้ใช้ระบบ$พาธ.
  • ไฟล์การกำหนดค่าสำหรับเชลล์ผู้ใช้แต่ละราย ตัวอย่างเช่น หากคุณใช้ Bash คุณสามารถตั้งค่าตัวแปร $PATH ในไฟล์ ~/.bashrc และหากคุณใช้ Zsh ชื่อไฟล์จะเป็น ~/.zshrc

ในตัวอย่างนี้ เราจะตั้งค่าตัวแปรในไฟล์ ~/.bashrc เปิดไฟล์ใน โปรแกรมแก้ไขข้อความและเพิ่มบรรทัดต่อไปนี้ต่อท้าย:

นาโน ~/.bashrc

ส่งออก PATH="$HOME/bin:$PATH"

บันทึกไฟล์และโหลดค่า $PATH ใหม่ลงในเซสชันเชลล์ปัจจุบันโดยใช้:

ที่มา ~/.bashrc

เพื่อยืนยันว่าเพิ่มไดเร็กทอรีสำเร็จแล้ว ให้พิมพ์ค่า $PATH โดยพิมพ์:

ก้อง $PATH

บทสรุป

การเพิ่มไดเร็กทอรีใหม่ให้กับผู้ใช้ของคุณหรือ $PATH ทั่วโลกนั้นค่อนข้างง่าย สิ่งนี้ทำให้คุณสามารถรันคำสั่งและสคริปต์ที่จัดเก็บไว้ในตำแหน่งที่ไม่ได้มาตรฐานโดยไม่ต้องป้อนเส้นทางแบบเต็มไปยังไฟล์ปฏิบัติการ

คำแนะนำเดียวกันนี้ใช้กับข้อใดข้อหนึ่ง การกระจายลินุกซ์รวมถึง CentOS, RHEL, Debian และ Linux Mint

อย่าลังเลที่จะแสดงความคิดเห็นหากคุณมีคำถามใด ๆ

มันคืออะไร? คำสั่งหลายคำสั่งที่คุณป้อนที่พร้อมท์คำสั่งจำเป็นต้องใช้โปรแกรมภายนอกที่โหลดจากระบบไฟล์ ตัวอย่างเช่น คำสั่งอย่าง mkdir และ wc จริงๆ แล้วอยู่ในโฟลเดอร์ /bin

เมื่อคุณป้อนคำสั่งที่ Bash Shell ไม่รู้จัก มันจะพยายามรันคำสั่งนั้นเป็นโปรแกรมและส่งกลับข้อผิดพลาดหากไม่พบโปรแกรมที่มีชื่อนั้น และสิ่งนี้ไม่เพียงใช้กับคำสั่งพื้นฐานที่เราดูเท่านั้นเพราะจากบรรทัดคำสั่งคุณสามารถเรียกใช้โปรแกรมใดก็ได้


แต่ถ้ามีไฟล์ ระบบลินุกซ์รู้ว่าโปรแกรมใดที่จะรันจากไดเร็กทอรีใด? ระบบปฏิบัติการใช้ตัวแปรสภาพแวดล้อมของระบบเพื่อระบุชุดย่อยของโฟลเดอร์เพื่อค้นหาเมื่อได้รับคำสั่งที่ไม่รู้จัก ตัวแปรนี้เรียกว่า PATH และสามารถแสดงได้ด้วยคำสั่ง echo ต่อไปนี้ (จำเป็นต้องมีสัญลักษณ์ $):

ก้อง $PATH

ผลลัพธ์ของคำสั่งนี้จะมีลักษณะเหมือนเส้นทางโฟลเดอร์สัมบูรณ์เจ็ดเส้นทางต่อไปนี้ คั่นด้วยเครื่องหมายทวิภาค:

/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/เกม

ทุกครั้งที่คุณป้อนสิ่งที่ไม่รู้จัก คำสั่งลินุกซ์จะดูแต่ละโฟลเดอร์ที่ระบุในตัวแปรสภาพแวดล้อมตามลำดับที่ระบุโดยพยายามค้นหาโปรแกรมที่มีชื่อเดียวกัน หากพบโปรแกรม โปรแกรมจะทำงาน มิฉะนั้นข้อความแสดงข้อผิดพลาดจะปรากฏขึ้น แต่จะไม่ผิดพลาดหากคุณซื้อแหวนเงินอันเป็นที่รักเป็นของขวัญ เงินจะประดับผู้หญิงทุกคน!

โฟลเดอร์ทั้งเจ็ดนี้มีให้ เข้าถึงได้ง่ายสู่โปรแกรมหลักๆ ทั้งหมดใน ระบบปฏิบัติการ, รวมทั้ง . โปรแกรมใดๆ ที่อยู่นอกโฟลเดอร์ทั้ง 7 โฟลเดอร์นี้ไม่สามารถเปิดได้โดยการพิมพ์ชื่อลงในบรรทัดคำสั่ง

ตัวอย่างเช่น คุณดาวน์โหลดยูทิลิตี้ไดอารี่จากอินเทอร์เน็ตไปยังโฟลเดอร์หลักของคุณ หากคุณป้อนชื่อที่พร้อมท์คำสั่ง คุณจะได้รับข้อความแสดงข้อผิดพลาดเนื่องจากอยู่ในโฟลเดอร์ที่ไม่รวมอยู่ในเส้นทางของระบบ หากต้องการรันโปรแกรมนี้ ให้ป้อนบรรทัดต่อไปนี้ (โปรดจำไว้ว่าสัญลักษณ์ ~ เป็นตัวย่อสำหรับโฟลเดอร์หลักของคุณ):

หากคุณบันทึกไว้ในโฟลเดอร์ที่อยู่นอกเส้นทางที่คุณระบุ คุณจะต้องป้อนเส้นทางที่แน่นอนและชื่อไฟล์เพื่อเรียกใช้ยูทิลิตี้

แน่นอนว่า สันนิษฐานว่า diary เป็นโปรแกรมสแตนด์อโลนธรรมดาๆ ที่ไม่จำเป็นต้องติดตั้ง เนื่องจากแอปพลิเคชันหลักส่วนใหญ่จะวางไฟล์ปฏิบัติการของโปรแกรมไว้ที่ใดที่หนึ่งในเส้นทางที่คุณระบุในระหว่างกระบวนการติดตั้ง แบบนี้ ตัวแปรสภาพแวดล้อม PATHสนุกกับมันเพื่อสุขภาพของคุณ!

ส่งออก PATH=~/opt/bin:$PATH

ส่งออก PATH=$PATH:~/opt/bin

9 โซลูชั่นรวบรวมเว็บฟอร์มสำหรับ “จะเพิ่มเส้นทางไปยัง PATH ได้อย่างไร”

สิ่งที่ง่าย

PATH=$PATH:~/opt/bin PATH=~/opt/bin:$PATH

ขึ้นอยู่กับว่าคุณต้องการเพิ่ม ~/opt/bin ต่อท้าย (เพื่อค้นหาไดเร็กทอรีอื่นทั้งหมดหากมีโปรแกรมชื่อเดียวกันในหลายไดเร็กทอรี) หรือที่จุดเริ่มต้น (เพื่อค้นหาก่อนไดเร็กทอรีอื่นทั้งหมด)

คุณสามารถเพิ่มหลายรายการพร้อมกันได้ PATH=$PATH:~/opt/bin:~/opt/node/bin หรือการเปลี่ยนแปลงการจัดลำดับก็เป็นเรื่องปกติ

คุณไม่จำเป็นต้องส่งออกหากตัวแปรอยู่ในสภาพแวดล้อมแล้ว: การเปลี่ยนแปลงค่าของตัวแปรจะมีผลในสภาพแวดล้อมนั้น PATH มักจะอยู่ในสภาพแวดล้อมเสมอ ทั้งหมด ระบบยูนิกซ์ติดตั้งเร็วมาก (โดยปกติแล้วจะเป็นกระบวนการแรกสุดจริงๆ)

หาก PATH ของคุณถูกสร้างขึ้นในส่วนประกอบที่แตกต่างกัน คุณอาจมีรายการที่ซ้ำกัน ดูวิธีเพิ่มเส้นทางไปยังไดเร็กทอรีต้นทางที่ Unix ตรวจพบคำสั่งคืออะไร และลบรายการ $PATH ที่ซ้ำกันโดยใช้คำสั่ง awk เพื่อหลีกเลี่ยงการเพิ่มรายการที่ซ้ำกันหรือลบออก

จะใส่ที่ไหน

โปรดทราบว่า ~/.bash_rc ไม่สามารถอ่านได้โดยโปรแกรมใด ๆ และ ~/.bashrc เป็นไฟล์กำหนดค่าสำหรับอินสแตนซ์ bash แบบโต้ตอบ คุณไม่ควรกำหนดตัวแปรสภาพแวดล้อมใน ~/.bashrc ตำแหน่งที่ถูกต้องในการกำหนดตัวแปรสภาพแวดล้อม เช่น PATH คือ ~/.profile (หรือ ~/.bash_profile หากคุณไม่ต้องการเชลล์ที่ไม่ใช่ bash) ดูว่าอะไรคือความแตกต่างระหว่างพวกเขาและฉันควรใช้อันไหน?

หมายเหตุเกี่ยวกับเชลล์ที่ไม่ใช่ bash

ใน bash, ksh และ zsh การส่งออกเป็นไวยากรณ์พิเศษและทั้ง PATH=~/opt/bin:$PATH และส่งออก PATH=~/opt/bin:$PATH ทำทุกอย่างถูกต้อง บนเชลล์ Bourne/POSIX อื่นๆ เช่น dash (ซึ่งก็คือ /bin/sh บนหลายระบบ) การส่งออกจะถูกแยกวิเคราะห์เหมือนกับคำสั่งปกติ ซึ่งแสดงถึงความแตกต่างสองประการ:

  • ~ ถูกแยกวิเคราะห์ที่จุดเริ่มต้นของคำเท่านั้น ยกเว้นในงานที่ได้รับมอบหมาย (ดูหัวข้อ "วิธีเพิ่มเส้นทางไปยังไดเร็กทอรีต้นทางที่ Unix ตรวจพบ คำสั่งใด")
  • $PATH นอกเครื่องหมายคำพูดคู่จะแตกถ้า PATH มีช่องว่างหรือ \[*? ,

ดังนั้นในเชลล์ที่มีลักษณะคล้ายเส้นประ ให้ส่งออก PATH=~/opt/bin:$PATH ตั้งค่า PATH เป็นสตริงตัวอักษร ~/opt/bin/: ตามด้วยค่าของ PATH จนถึงตำแหน่งแรก PATH=~/opt/bin:$PATH (การมอบหมายแบบคลุมเครือ) ไม่จำเป็นต้องมีเครื่องหมายคำพูดและทำสิ่งที่ถูกต้อง หากคุณต้องการใช้การเอ็กซ์พอร์ตในสคริปต์แบบพกพา คุณต้องเขียนexport PATH="$HOME/opt/bin:$PATH"

¹ สิ่งนี้ไม่เป็นความจริงในจรวดบอร์น (เช่นเดียวกับในกระสุนบอร์นจริง ไม่ใช่กระสุนสไตล์ POSIX สมัยใหม่) แต่คุณไม่น่าจะพบกระสุนแบบเก่าในทุกวันนี้

แม้จะใช้งานได้ แต่ไม่ได้ทำสิ่งเดียวกัน: องค์ประกอบ PATH จะถูกตรวจสอบจากซ้ายไปขวา ในตัวอย่างแรก ไฟล์ปฏิบัติการใน ~/opt/bin จะมีความสำคัญเหนือกว่าที่ติดตั้งในเช่น /usr/bin ซึ่งอาจเป็นสิ่งที่คุณต้องการหรือไม่ก็ได้

โดยเฉพาะอย่างยิ่งจากมุมมองด้านความปลอดภัย การเพิ่มเส้นทางไปด้านหน้าเป็นสิ่งที่อันตราย เพราะหากมีใครสามารถเข้าถึงการเขียน ~/opt/bin ของคุณได้ พวกเขาอาจวาง ls อื่น ๆ ที่คุณ "อาจใช้แทน / bin/ls โดยไม่สังเกตเห็น ทีนี้ลองนึกภาพเหมือนกับ ssh หรือเบราว์เซอร์หรือตัวเลือกของคุณ ... (สิ่งเดียวกันนี้สามารถทำได้สามครั้งในเส้นทางของคุณ)

ฉันสับสนกับคำถามที่ 2 (เนื่องจากถูกลบออกจากคำถามเนื่องจากเกี่ยวข้องกับปัญหาที่ไม่เกี่ยวข้อง):

อะไร วิธีการที่มีประสิทธิภาพเพิ่มเส้นทางเพิ่มเติมไปยังบรรทัดต่างๆ? ตอนแรกฉันคิดว่านี่อาจเป็นการหลอกลวง:

ส่งออก PATH=$PATH:~/opt/bin ส่งออก PATH=$PATH:~/opt/node/bin

แต่ไม่ได้เป็นเพราะการมอบหมายครั้งที่สองไม่เพียงเพิ่ม ~/opt/node/bin แต่ยังกำหนด PATH ไว้ก่อนหน้านี้ทั้งหมดด้วย

นี่เป็นวิธีแก้ปัญหาที่เป็นไปได้:

ส่งออก PATH=$PATH:~/opt/bin:~/opt/node/bin

แต่เพื่อให้อ่านง่าย ฉันควรมีปลายทางเดียวต่อเส้นทาง

ถ้าคุณพูด

PATH=~/opt/bin

นี้ ทั้งหมด,สิ่งที่จะอยู่ในเส้นทางของคุณ PATH เป็นเพียงตัวแปรสภาพแวดล้อม และหากคุณต้องการเพิ่มลงใน PATH คุณจะต้องสร้างตัวแปรใหม่โดยมีเนื้อหาที่คุณต้องการ ดังนั้นสิ่งที่คุณให้เป็นตัวอย่างในคำถามที่ 2 คือสิ่งที่คุณต้องการทำอย่างแน่นอน เว้นแต่ว่าฉันจะพลาดประเด็นของคำถามไปโดยสิ้นเชิง

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

ส่งออก PATH=/opt/bin:/usr/local/bin:/usr/contrib/bin:/bin:/usr/bin:/usr/sbin:/usr/bin/X11 # เพิ่มรายการทางเลือกให้กับเส้นทางสำหรับ bindir ใน $HOME/local/bin $HOME/bin; ทำถ้า [ -d $bindir ]; จากนั้น PATH=$PATH:$(bindir) fi เสร็จแล้ว

Linux กำหนดเส้นทางการค้นหาที่สามารถเรียกใช้งานได้จากสภาพแวดล้อม $PATH หากต้องการเพิ่มไดเร็กทอรี /data/myscripts ที่ด้านบนของสภาพแวดล้อม $PATH ให้ใช้ดังต่อไปนี้:

PATH=/data/myscripts:$PATH

หากต้องการเพิ่มไดเร็กทอรีนี้ที่ส่วนท้ายของพาธ ให้ใช้คำสั่งต่อไปนี้:

PATH=$PATH:/data/myscripts

แต่อันก่อนหน้านี้ยังไม่เพียงพอ เพราะเมื่อคุณตั้งค่าตัวแปรสภาพแวดล้อมภายในสคริปต์ การเปลี่ยนแปลงนั้นจะมีผลเฉพาะภายในสคริปต์เท่านั้น ข้อจำกัดนี้จำกัดอยู่เพียงสองวิธีเท่านั้น:

  • หากคุณส่งออกตัวแปรสภาพแวดล้อมในสคริปต์ ตัวแปรนั้นจะมีผลกับโปรแกรมใดๆ ที่เรียกใช้โดยสคริปต์ โปรดทราบว่าวิธีนี้ใช้ไม่ได้ผลกับโปรแกรมที่เรียกว่าสคริปต์
  • หากโปรแกรมที่เรียกใช้สคริปต์ดำเนินการโดยรวมแทนการโทร การเปลี่ยนแปลงสภาพแวดล้อมใดๆ ในสคริปต์จะมีผลกับโปรแกรมที่เรียกใช้ การรวมนี้สามารถทำได้โดยใช้คำสั่ง dot หรือคำสั่ง source

แหล่งที่มา $HOME/myscript.sh $HOME/myscript.sh

โดยทั่วไปการรวมจะรวมถึงสคริปต์ "callable" ในสคริปต์ "call" สิ่งนี้คล้ายกับ #include ใน C ดังนั้นจึงมีประสิทธิภาพภายในสคริปต์หรือการเรียกใช้โปรแกรม แต่แน่นอนว่าสิ่งนี้จะไม่มีผลกับโปรแกรมหรือสคริปต์ใด ๆ ที่เรียกใช้โดยโปรแกรมที่เรียก เพื่อให้มีประสิทธิภาพจนถึงสายการเรียก คุณต้องปฏิบัติตามการตั้งค่าตัวแปรสภาพแวดล้อมโดยใช้คำสั่งส่งออก

ตามตัวอย่าง โปรแกรม bash shell จะรวมเนื้อหาของไฟล์ .bash_profile ไว้ด้วย ดังนั้นให้เพิ่ม 2 บรรทัดต่อไปนี้ใน .bash_profile:

PATH=$PATH:/data/myscripts ส่งออก PATH

ใส่โค้ด 2 บรรทัดนั้นลงในโปรแกรมทุบตีอย่างมีประสิทธิภาพ ดังนั้นใน ตัวแปรทุบตี$PATH ประกอบด้วย $HOME/myscript.sh และเนื่องจากคำสั่งส่งออก โปรแกรมใดๆ ที่ถูกเรียกโดย bash จึงมีการแก้ไข $PATH และเนื่องจากโปรแกรมใดๆ ที่เปิดตัวจาก bash prompt จะถูกเรียกโดย bash เส้นทางใหม่จึงใช้ได้กับทุกสิ่งที่คุณเปิดจาก bash prompt

บรรทัดล่างคือในการเพิ่มไดเร็กทอรีใหม่ให้กับพาธ คุณจะต้องต่อท้ายหรือต่อท้ายไดเร็กทอรีเข้ากับตัวแปรสภาพแวดล้อม $PATH ในสคริปต์ที่รวมอยู่ในเชลล์ และคุณต้องส่งออกตัวแปรสภาพแวดล้อม $PATH

ข้อมูลเพิ่มเติมที่นี่

ในบางครั้งฉันได้เก็บฟังก์ชันสองอย่าง pathadd และ pathrm ไว้กับฉันซึ่งช่วยเพิ่มองค์ประกอบให้กับเส้นทางโดยไม่ต้องกังวลกับการทำซ้ำ

pathadd รับหนึ่งอาร์กิวเมนต์เส้นทางและตัวเลือกหลังอาร์กิวเมนต์ซึ่งหากเพิ่มจะถูกเพิ่มใน PATH มิฉะนั้นจะเป็นการเพิ่ม

ในเกือบทุกสถานการณ์ หากคุณเพิ่มเส้นทาง คุณอาจต้องการแทนที่ทุกสิ่งที่อยู่ในเส้นทางอยู่แล้ว ดังนั้นฉันจึงชอบเพิ่มตามค่าเริ่มต้น

Pathadd() ( newelement=$(1%/) if [ -d "$1" ] && ! echo $PATH | grep -E -q "(^|:)$newelement($|:)" ; แล้วถ้า [ " $2" = "หลัง" ] ; จากนั้น PATH="$PATH:$newelement" else PATH="$newelement:$PATH" fi fi ) pathrm() ( PATH="$(echo $PATH | sed -e "s; \(^\|:\)$(1%/)\(:\|\$\);\1\2;g" -e "s;^:\|:$;;g" -e "s ;::;:;g")" )

วางไว้ในสคริปต์ที่คุณต้องการเปลี่ยนสภาพแวดล้อม PATH และตอนนี้คุณก็สามารถทำได้แล้ว

Pathadd "/foo/bar" pathadd "/baz/bat" หลังจากส่งออก PATH

รับประกันว่าจะไม่เพิ่มเส้นทางหากมีอยู่แล้ว หากคุณต้องการให้ /baz/bat อยู่ที่จุดเริ่มต้น

Pathrm "/baz/bat" pathadd "/baz/bat" ส่งออก PATH

ขณะนี้เส้นทางใดๆ สามารถนำไปด้านหน้าได้ หากอยู่บนเส้นทางแล้วโดยไม่ต้องเพิ่มเป็นสองเท่า

ฉันไม่สามารถพูดถึงการแจกแจงแบบอื่นได้ แต่ Ubuntu มีไฟล์ /etc/environment ซึ่งเป็นเส้นทางการค้นหามาตรฐานสำหรับผู้ใช้ทุกคน เนื่องจากฉันใช้งานคอมพิวเตอร์ของฉันคนเดียว ฉันจึงใส่ไดเร็กทอรีใดก็ได้ที่ฉันต้องการในเส้นทางของฉัน ตราบใดที่มันเป็นส่วนเพิ่มเติมชั่วคราวที่ฉันใส่ลงในสคริปต์

นี่คือวิธีแก้ปัญหาของฉัน:

PATH=$(echo -n $PATH | awk -v RS=: -v ORS=: "!x[$0]++" | sed "s/\(.*\).\(1\)/\1 /")

ไลเนอร์เนื้อบางเบาที่ไม่ทิ้งร่องรอย:

สำหรับฉัน (บน Mac OS X 10.9.5) การเพิ่มชื่อพา ธ (เช่น /mypathname) ให้กับไฟล์ /etc/paths นั้นทำงานได้ดีมาก

ก่อนที่จะแก้ไข echo $PATH จะถูกส่งกลับ:

/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin

หลังจากแก้ไข /etc/paths และรีสตาร์ทเชลล์ ตัวแปร $PATH จะถูกเพิ่มด้วย /pathname แท้จริงแล้ว echo $PATH ส่งคืน:

/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin:/mypathname

สิ่งที่เกิดขึ้นคือ /mypathname ถูกเพิ่มใน $PATH

หากต้องการเพิ่มเส้นทางใหม่ให้กับ PATH สภาพแวดล้อม PATH:

ส่งออก PATH=$PATH:/new-path/

หากต้องการให้การเปลี่ยนแปลงนี้มีผลกับทุกเชลล์ที่คุณเปิด ให้เพิ่มลงในไฟล์ที่เชลล์จะเรียกใช้เมื่อคุณเรียกใช้ ในเชลล์ที่แตกต่างกัน นี่อาจเป็น:

  • Bash Shell: ~/.bash_profile, ~/.bashrc หรือโปรไฟล์
  • Korn Shell: ~/.kshrc หรือ .profile
  • Z เชลล์: ~/.zshrc หรือ .zprofile

ตัวอย่างเช่น

# ส่งออก PATH=$PATH:/root/learning/bin/ # source ~/.bashrc # echo $PATH

คุณสามารถดูเส้นทางที่ให้ไว้ในผลลัพธ์ด้านบน

ไฟล์ทั้งหมดใน Linux มีที่อยู่เฉพาะในระบบไฟล์ซึ่งเราสามารถเข้าถึงได้โดยใช้ตัวจัดการไฟล์หรือยูทิลิตี้คอนโซล นี่เป็นหัวข้อที่ค่อนข้างง่าย แต่ผู้เริ่มต้นหลายคนประสบปัญหานี้

ในบทความสั้น ๆ ของวันนี้ เราจะมาดูกันว่าพาธไปยังไฟล์ Linux คืออะไร เป็นไปได้อย่างไร เขียนอย่างไรให้ถูกต้อง และอื่นๆ อีกมากมาย หากคุณเคยประสบปัญหานี้มาก่อนหลังจากอ่านบทความแล้วทุกอย่างจะชัดเจนขึ้น

เส้นทางไฟล์ใน Linux

ระบบไฟล์ Linux แตกต่างจาก Windows มาก เราจะไม่พิจารณาโครงสร้างของมันซึ่งทำไปแล้วก่อนหน้านี้ เราจะมุ่งเน้นไปที่การทำงานกับไฟล์

ข้อแตกต่างที่สำคัญที่สุดคือที่อยู่ไฟล์ไม่ได้เริ่มจากไดรฟ์ เช่น C:\ หรือ D:\ เหมือนกับที่เกิดขึ้นใน Windows แต่จากรูท ซึ่งเป็นไดเร็กทอรีระบบรูทที่ส่วนอื่นๆ ทั้งหมดเชื่อมต่ออยู่ ที่อยู่ของเขา - /. และที่นี่เราต้องพูดถึงที่อยู่ พาธของไฟล์ Linux ใช้เครื่องหมายทับ "/" เพื่อแยกไดเร็กทอรีในที่อยู่ ซึ่งแตกต่างไปจากที่คุณคุ้นเคยบน Windows - \.

เช่น ถ้าเข้า. หน้าต่างเต็มเส้นทางไปยังไฟล์บนเดสก์ท็อปดูเหมือน C:\Users\Sergiy\Desktop\ ดังนั้นเส้นทางของไฟล์ใน Linux จะเป็นเพียงแค่ /home/sergiy/desktop/ ด้วยเหตุนี้ ทุกอย่างจึงเรียบง่ายและชัดเจน แต่ปัญหาก็เกิดขึ้นอีก

ในระบบปฏิบัติการ Linux มีพาธไฟล์ได้หลายประเภท มาดูกันว่ามีเส้นทางใดบ้างใน Linux:

  • พาธลินุกซ์แบบเต็มจากรูทระบบไฟล์- คุณได้เห็นเส้นทางนี้ในตัวอย่างด้านบนแล้ว โดยเริ่มต้นจากรูท “/” และอธิบายเส้นทางทั้งหมดไปยังไฟล์
  • เส้นทางสัมพัทธ์ของ Linux- นี่คือเส้นทางไปยังไฟล์ที่เกี่ยวข้องกับโฟลเดอร์ปัจจุบัน เส้นทางดังกล่าวมักทำให้เกิดความสับสน
  • เส้นทางที่เกี่ยวข้องกับโฟลเดอร์โฮมของผู้ใช้ปัจจุบัน- เส้นทางในระบบไฟล์ แต่ไม่ใช่จากรูท แต่มาจากโฟลเดอร์ของผู้ใช้ปัจจุบัน

ตอนนี้เรามาดูกันว่าเส้นทางเหล่านี้มีลักษณะอย่างไรใน Linux และดูตัวอย่างบางส่วนเพื่อให้ชัดเจนยิ่งขึ้น สำหรับการสาธิต เราจะใช้ยูทิลิตี้ ls ซึ่งออกแบบมาเพื่อดูเนื้อหาของไดเร็กทอรี

ตัวอย่างเช่น เรามีไดเร็กทอรีลักษณะนี้ในโฮมโฟลเดอร์ซึ่งมีไฟล์สี่ไฟล์อยู่ในนั้น:

นี่คือลักษณะของเส้นทาง Linux แบบเต็มไปยังไฟล์ใดไฟล์หนึ่ง:

ls /home/sergiy/tmp/file1

นี่เป็นเส้นทาง Linux สัมพัทธ์ซึ่งเริ่มต้นจากโฟลเดอร์โฮมซึ่งถูกกำหนดไว้ ~/. หมายเหตุ ไม่ใช่ ~ คือ ~/. จากนั้นคุณสามารถระบุโฟลเดอร์ย่อยได้ ในกรณีของเรา tmp:

หรือเส้นทางของไฟล์ใน Linux สัมพันธ์กับโฟลเดอร์ปัจจุบัน:

ลิงค์แรกชี้ไปที่โฟลเดอร์ปัจจุบัน (.) ส่วนลิงค์ที่สอง (..) ชี้ไปที่โฟลเดอร์ที่สูงกว่า นี่เป็นการเปิดโอกาสให้การนำทางในแคตตาล็อกมากยิ่งขึ้น ตัวอย่างเช่น หากต้องการอ้างถึงไฟล์ในโฟลเดอร์ปัจจุบัน คุณสามารถใช้โครงสร้างต่อไปนี้:

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

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

แต่ เทอร์มินัลลินุกซ์ให้โอกาสที่มากยิ่งขึ้น คุณสามารถใช้อักขระไวด์การ์ดธรรมดาในที่อยู่ไฟล์หรือไดเร็กทอรีได้โดยตรง ตัวอย่างเช่น คุณสามารถแสดงรายการไฟล์ทั้งหมดที่ขึ้นต้นด้วย f:

หรือคุณสามารถค้นหาได้ไม่เฉพาะในโฟลเดอร์ tmp แต่ยังค้นหาในโฟลเดอร์ย่อยของโฟลเดอร์หลักของคุณ:

และทั้งหมดนี้อาจจะได้ผลบางทีอาจไม่จำเป็นและใช้งานได้จริงเสมอไป แต่ในบางสถานการณ์ก็สามารถช่วยได้มาก ฟังก์ชั่นเหล่านี้ถูกนำไปใช้ในระดับ Bash เชลล์ ดังนั้นคุณสามารถใช้มันในคำสั่งใดก็ได้ เชลล์จะดูว่ามีไฟล์จำนวนเท่าใดที่พบและเรียกใช้คำสั่งสำหรับแต่ละไฟล์

ข้อสรุป

นั่นคือทั้งหมดที่ ตอนนี้คุณรู้ทุกสิ่งที่คุณต้องการไม่เพียงแต่เขียนเส้นทางอย่างถูกต้องเท่านั้น ไฟล์ลินุกซ์แต่ยังดำเนินการที่ซับซ้อนมากขึ้น เช่น การค้นหาไฟล์หรือการนำทางผ่านไดเร็กทอรีโดยใช้คำสั่ง cd หากคุณมีคำถามใด ๆ ถามในความคิดเห็น!

กระทู้ที่เกี่ยวข้อง:


ฉันสงสัยว่าควรเพิ่มเส้นทางใหม่ให้กับตัวแปรสภาพแวดล้อม PATH ที่ไหน ฉันรู้ว่าสามารถทำได้โดยการแก้ไข .bashrc (ตัวอย่าง) แต่ยังไม่ชัดเจนว่าต้องทำอย่างไร

ดังนั้น:

ส่งออก PATH=~/opt/bin:$PATH

ส่งออก PATH=$PATH:~/opt/bin

11 คำตอบ

วัสดุที่เรียบง่าย

PATH=$PATH:~/opt/bin PATH=~/opt/bin:$PATH

ขึ้นอยู่กับว่าคุณต้องการเพิ่มโค้ด ~/opt/bin ต่อท้าย (เพื่อค้นหาไดเร็กทอรีอื่นทั้งหมดหากมีโปรแกรมชื่อเดียวกันในหลายไดเร็กทอรี) หรือไปที่จุดเริ่มต้น (เพื่อค้นหาก่อนไดเร็กทอรีอื่นทั้งหมด)

คุณสามารถเพิ่มหลายรายการพร้อมกันได้ PATH=$PATH:~/opt/bin:~/opt/node/bin หรือการเปลี่ยนแปลงการจัดลำดับก็เป็นเรื่องปกติ

คุณไม่จำเป็นต้องส่งออกหากตัวแปรอยู่ในสภาพแวดล้อมอยู่แล้ว: การเปลี่ยนแปลงใดๆ ที่เกิดขึ้นกับค่าของตัวแปรจะสะท้อนให้เห็นในสภาพแวดล้อมนั้น¹ PATH มักจะอยู่ในสภาพแวดล้อมเสมอ ระบบยูนิกซ์ทั้งหมดติดตั้งเร็วมาก (โดยปกติแล้วจะเป็นกระบวนการแรกสุดในความเป็นจริง)

หาก PATH ของคุณถูกสร้างขึ้นโดยส่วนประกอบต่างๆ มากมาย คุณอาจมีรายการที่ซ้ำกัน ดูวิธีเพิ่มเส้นทางไปยังโฮมไดเร็กตอรี่ของคุณที่ Unix ตรวจพบคำสั่งใด และลบรายการ $PATH ที่ซ้ำกันโดยใช้คำสั่ง awk เพื่อหลีกเลี่ยงการซ้ำกันหรือลบออก

จะใส่ที่ไหน

โปรดทราบว่า ~/.bash_rc ไม่สามารถอ่านได้โดยโปรแกรมใด ๆ และ ~/.bashrc เป็นไฟล์กำหนดค่าสำหรับอินสแตนซ์ bash แบบโต้ตอบ คุณไม่ควรกำหนดตัวแปรสภาพแวดล้อมใน ~/.bashrc ตำแหน่งที่ถูกต้องในการกำหนดตัวแปรสภาพแวดล้อมเช่น PATH คือ ~/.profile (หรือ ~/.bash_profile หากคุณไม่ชอบเชลล์อื่นที่ไม่ใช่ bash) ดูความแตกต่างระหว่างพวกเขาคืออะไรและฉันควรใช้อันไหน?

หมายเหตุเกี่ยวกับเชลล์ที่ไม่ใช่ bash

ใน bash, ksh และ zsh การส่งออกเป็นไวยากรณ์พิเศษและทั้ง PATH=~/opt/bin:$PATH และส่งออก PATH=~/opt/bin:$PATH ทำสิ่งที่ถูกต้องด้วยซ้ำ บนเชลล์ Bourne/POSIX อื่นๆ เช่น dash (ซึ่งก็คือ /bin/sh บนหลายระบบ) การส่งออกจะถูกแยกวิเคราะห์เหมือนกับคำสั่งปกติ ซึ่งแสดงถึงความแตกต่างสองประการ:

  • ~ ถูกแยกวิเคราะห์ที่จุดเริ่มต้นของคำเท่านั้น ยกเว้นในงานที่ได้รับมอบหมาย (ดู ฉันจะเพิ่มพาธโฮมไดเร็กทอรีที่ Unix ตรวจพบซึ่งต้องใช้คำสั่งได้อย่างไร ;
  • $PATH ภายนอก เครื่องหมายคำพูดคู่หยุดพักถ้า PATH มีช่องว่างหรือ \[*? .

ดังนั้นในเชลล์เช่น dash ให้ส่งออก PATH=~/opt/bin:$PATH ตั้งค่า PATH เป็นสตริงตัวอักษร ~/opt/bin/: ตามด้วยค่า PATH จนถึงตำแหน่งแรก PATH=~/opt/bin:$PATH (การมอบหมายอย่างง่าย) ไม่จำเป็นต้องมีเครื่องหมายคำพูดและทำทุกอย่างถูกต้อง หากคุณต้องการใช้การส่งออกในสคริปต์แบบพกพา คุณต้องเขียนexport PATH="$HOME/opt/bin:$PATH" หรือ PATH=~/opt/bin:$PATHexport PATH (หรือ PATH=$HOME/opt /bin: $PATH ส่งออก PATH เพื่อการพกพาแม้กระทั่งกับเชลล์เป้าหมาย ซึ่งไม่ยอมรับการส่งออก var=value และไม่ได้ขยายเครื่องหมายทิลเดอ)

¹ สิ่งนี้ไม่เป็นความจริงในเชลล์เป้าหมาย (เช่นเดียวกับในเชลล์เป้าหมายจริง ไม่ใช่เชลล์สไตล์ POSIX สมัยใหม่) แต่คุณไม่น่าจะพบเชลล์แบบเก่าในทุกวันนี้ ย่อย>

ทั้งสองวิธีใช้งานได้ แต่ไม่ได้ทำสิ่งเดียวกัน: องค์ประกอบ PATH จะถูกตรวจสอบจากซ้ายไปขวา ในตัวอย่างแรก ไฟล์ปฏิบัติการใน ~/opt/bin จะมีความสำคัญมากกว่าไฟล์ที่ติดตั้งไว้ เช่น /usr/bin ซึ่งอาจเป็นสิ่งที่คุณต้องการหรือไม่ก็ได้

โดยเฉพาะอย่างยิ่ง จากมุมมองด้านความปลอดภัย การเพิ่มเส้นทางไปด้านหน้านั้นเป็นอันตราย เพราะหากมีใครสามารถเข้าถึงการเขียน ~/opt/bin ของคุณได้ พวกเขาอาจจะใส่ ls อีกอันหนึ่งไว้ด้วย ซึ่งคุณอาจใช้แทน /bin/ls โดยไม่สังเกตเห็น ทีนี้ลองจินตนาการถึงสิ่งเดียวกันสำหรับ ssh หรือเบราว์เซอร์หรือตัวเลือกของคุณ ... (สิ่งเดียวกันสามครั้งบนเส้นทางของคุณ)

ฉันสับสนเกี่ยวกับคำถามที่ 2 (เนื่องจากถูกลบออกจากคำถามเนื่องจากไม่เกี่ยวข้องกับคำถาม ปัญหาที่เกี่ยวข้อง):

วิธีที่มีประสิทธิภาพในการเพิ่มเส้นทางเพิ่มเติมไปยังบรรทัดต่างๆ คืออะไร ตอนแรกฉันคิดว่านี่อาจเป็นการหลอกลวง:

ส่งออก PATH=$PATH:~/opt/bin ส่งออก PATH=$PATH:~/opt/node/bin

แต่นั่นไม่ใช่เพราะการมอบหมายครั้งที่สองไม่เพียงเพิ่ม ~/opt/node/bin แต่ยังกำหนด PATH ไว้ก่อนหน้านี้ด้วย

นี่เป็นวิธีแก้ปัญหาที่เป็นไปได้:

ส่งออก PATH=$PATH:~/opt/bin:~/opt/node/bin

แต่เพื่อให้อ่านง่าย ฉันควรมีปลายทางเดียวต่อเส้นทาง

ถ้าคุณพูด

PATH=~/opt/bin

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

ฉันใช้ทั้งสองรูปแบบในรหัสของฉัน ฉันมีโปรไฟล์ทั่วไปที่ฉันติดตั้งบนทุกเครื่องที่ฉันใช้งานซึ่งมีลักษณะเช่นนี้ เพื่อโฮสต์ไดเร็กทอรีที่อาจขาดหายไป:

ส่งออก PATH=/opt/bin:/usr/local/bin:/usr/contrib/bin:/bin:/usr/bin:/usr/sbin:/usr/bin/X11 # เพิ่มรายการทางเลือกให้กับเส้นทางสำหรับ bindir ใน $HOME/local/bin $HOME/bin; ทำถ้า [ -d $bindir ]; จากนั้น PATH=$PATH:$(bindir) fi เสร็จแล้ว

Linux กำหนดเส้นทางการค้นหาที่สามารถเรียกใช้งานได้ด้วยตัวแปรสภาพแวดล้อม $PATH หากต้องการเพิ่มไดเร็กทอรี /data/myscripts ไปที่จุดเริ่มต้นของตัวแปรสภาพแวดล้อม $PATH ให้ใช้ดังต่อไปนี้:

PATH=/data/myscripts:$PATH

หากต้องการเพิ่มไดเร็กทอรีนี้ที่ส่วนท้ายของพาธ ให้ใช้คำสั่งต่อไปนี้:

PATH=$PATH:/data/myscripts

แต่อันก่อนหน้านี้ยังไม่เพียงพอ เพราะเมื่อคุณตั้งค่าตัวแปรสภาพแวดล้อมภายในสคริปต์ การเปลี่ยนแปลงนั้นจะมีผลเฉพาะภายในสคริปต์เท่านั้น ข้อจำกัดนี้ถูกจำกัดด้วยสองวิธี:

  • หากคุณเอ็กซ์พอร์ตตัวแปรสภาพแวดล้อมภายในสคริปต์ ตัวแปรนั้นจะมีผลภายในโปรแกรมใดๆ ที่สคริปต์เรียก โปรดทราบว่าสิ่งนี้ไม่มีผลในโปรแกรมที่เรียกสคริปต์
  • หากโปรแกรมที่เรียกใช้สคริปต์ดำเนินการโดยรวมแทนการโทร การเปลี่ยนแปลงสภาพแวดล้อมใดๆ ในสคริปต์จะมีผลกับโปรแกรมที่เรียกใช้ การรวมนี้สามารถทำได้โดยใช้คำสั่ง dot หรือคำสั่ง source

แหล่งที่มา $HOME/myscript.sh $HOME/myscript.sh

โดยทั่วไปการรวมจะรวมถึงสคริปต์ "callable" ในสคริปต์ "call" สิ่งนี้คล้ายกับ #include ใน C ดังนั้นจึงมีประสิทธิภาพภายในสคริปต์หรือการเรียกใช้โปรแกรม แต่แน่นอนว่าสิ่งนี้จะไม่มีผลกับโปรแกรมหรือสคริปต์ใด ๆ ที่เรียกใช้โดยโปรแกรมที่เรียก เพื่อให้มีประสิทธิภาพจนถึงสายการเรียก คุณต้องปฏิบัติตามการตั้งค่าตัวแปรสภาพแวดล้อมโดยใช้คำสั่งส่งออก

ตามตัวอย่าง โปรแกรม bash shell จะรวมเนื้อหาของไฟล์ .bash_profile ไว้ด้วย ดังนั้นใส่ 2 บรรทัดต่อไปนี้ใน .bash_profile:

PATH=$PATH:/data/myscripts ส่งออก PATH

ใส่โค้ด 2 บรรทัดนั้นลงในโปรแกรมทุบตีอย่างมีประสิทธิภาพ ดังนั้นใน bash ตัวแปร $PATH จึงรวม $HOME/myscript.sh ด้วย และเนื่องจากคำสั่งส่งออก โปรแกรมใดๆ ที่ถูกเรียกโดย bash จึงมีการแก้ไขตัวแปร $PATH และเนื่องจากโปรแกรมใดๆ ที่คุณเปิดจาก bash prompt จะถูกเรียกโดย bash เส้นทางใหม่จึงใช้กับทุกสิ่งที่คุณเปิดจาก bash prompt

บรรทัดล่างคือในการเพิ่มไดเร็กทอรีใหม่ให้กับพาธ คุณจะต้องต่อท้ายหรือต่อท้ายไดเร็กทอรีเข้ากับตัวแปรสภาพแวดล้อม $PATH ในสคริปต์ที่รวมอยู่ในเชลล์ และคุณต้องส่งออกตัวแปรสภาพแวดล้อม $PATH

ฉันเก็บฟังก์ชันสองอย่าง pathadd และ pathrm ไว้กับฉันมาระยะหนึ่งแล้วซึ่งช่วยเพิ่มองค์ประกอบให้กับเส้นทางโดยไม่ต้องกังวลกับการทำซ้ำ

pathadd รับหนึ่งอาร์กิวเมนต์ path และอาร์กิวเมนต์ทางเลือกหลัง ซึ่งหากเพิ่มจะถูกเพิ่มใน PATH มิฉะนั้นจะเป็นการเพิ่ม

ในทุกสถานการณ์ หากคุณกำลังเพิ่มเส้นทาง คุณอาจต้องการแทนที่สิ่งใดก็ตามที่อยู่ในเส้นทางนั้นอยู่แล้ว ดังนั้นฉันจึงชอบที่จะเพิ่มตามค่าเริ่มต้น

Pathadd() ( newelement=$(1%/) if [ -d "$1" ] && ! echo $PATH | grep -E -q "(^|:)$newelement($|:)" ; แล้วถ้า [ " $2" = "หลัง" ] ; จากนั้น PATH="$PATH:$newelement" else PATH="$newelement:$PATH" fi fi ) pathrm() ( PATH="$(echo $PATH | sed -e "s; \(^\|:\)$(1%/)\(:\|\$\);\1\2;g" -e "s;^:\|:$;;g" -e "s ;::;:;g")" )

วางไว้ในสคริปต์ที่คุณต้องการเปลี่ยนสภาพแวดล้อม PATH เท่านี้ก็เสร็จสิ้นแล้ว

Pathadd "/foo/bar" pathadd "/baz/bat" หลังจากส่งออก PATH

รับประกันว่าจะไม่เพิ่มเส้นทางหากมีอยู่แล้ว หากคุณต้องการให้ /baz/bat ทำงานก่อน

Pathrm "/baz/bat" pathadd "/baz/bat" ส่งออก PATH

ตอนนี้เส้นทางใดๆ ก็สามารถย้ายไปด้านหน้าได้ หากเส้นทางนั้นอยู่บนเส้นทางแล้วโดยไม่ต้องเพิ่มเป็นสองเท่า

วิธีการเติม/เตรียมการกันกระสุน

มีข้อควรพิจารณาหลายประการในการเลือกเพิ่มและเพิ่ม คำตอบอื่น ๆ ครอบคลุมหลายข้อ ดังนั้นฉันจะไม่พูดซ้ำที่นี่

จุดสำคัญคือแม้ว่าสคริปต์ระบบจะไม่ใช้สิ่งนี้ (ฉันสงสัยว่าทำไม) *1 มันเป็นวิธีที่ป้องกันกระสุนในการเพิ่มเส้นทาง (เช่น $HOME/bin) ให้กับตัวแปรสภาพแวดล้อม PATH

PATH="$(PATH:+$(PATH):)$HOME/bin"

เพื่อเพิ่ม (แทน PATH="$PATH:$HOME/bin") และ

PATH="$HOME/bin$(PATH:+:$(PATH))"

เพื่อเพิ่ม (แทน PATH="$HOME/bin:$PATH")

วิธีนี้จะหลีกเลี่ยงโคลอนนำหน้า/ต่อท้ายที่ผิดพลาดเมื่อ $PATH ว่างเปล่าในตอนแรก ซึ่งอาจมีผลข้างเคียงที่ไม่พึงประสงค์และอาจเป็นฝันร้ายในการค้นหา (คำตอบนี้จะกล่าวถึงกรณี awk -way สั้นๆ)

$(พารามิเตอร์:+คำ)

หากพารามิเตอร์เป็นโมฆะหรือไม่ได้ตั้งค่า จะไม่มีการแทนที่ใดๆ มิฉะนั้นจะถูกแทนที่ คำคำ.

ดังนั้น $(PATH:+$(PATH):) ขยายเป็น: 1) ไม่มีสิ่งใดหาก PATH เป็นโมฆะหรือไม่ได้ตั้งค่า 2) $(PATH): หากตั้งค่า PATH

บันทึก. นี่มีไว้สำหรับทุบตี

*1 ฉันเพิ่งพบว่าสคริปต์เช่น devtoolset-6/enable ใช้สิ่งนี้ $ cat /opt/rh/devtoolset-6/enable # ตัวแปรสภาพแวดล้อมทั่วไปส่งออก PATH=/opt/rh/devtoolset-6/root/usr /bin $(เส้นทาง:+:$(เส้นทาง)) ...

ฉันไม่สามารถพูดถึงการแจกแจงแบบอื่นได้ แต่ Ubuntu มีไฟล์ /etc/environment ซึ่งเป็นเส้นทางการค้นหาเริ่มต้นสำหรับผู้ใช้ทั้งหมด เนื่องจากคอมพิวเตอร์ของฉันใช้งานโดยฉันคนเดียว ฉันจึงใส่ไดเร็กทอรีใดก็ตามที่ฉันต้องการในเส้นทางของฉันที่นั่น เว้นแต่จะเป็นการเพิ่มชั่วคราวลงในสคริปต์

สำหรับฉัน (บน Mac OS X 10.9.5) การเพิ่มชื่อพา ธ (เช่น /mypathname) ให้กับไฟล์ /etc/paths นั้นทำงานได้ดีมาก

ก่อนที่จะแก้ไข echo $PATH จะถูกส่งกลับ:

/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin

หลังจากแก้ไข /etc/paths และรีสตาร์ทเชลล์ ตัวแปร $PATH จะถูกเพิ่มด้วย /pathname แท้จริงแล้ว echo $PATH ส่งคืน:

/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin:/mypathname

สิ่งที่เกิดขึ้นคือ /mypathname ถูกเพิ่มเข้าไปในตัวแปร $PATH