การเพิ่มรายการใหม่ให้กับตัวแปร PATH ใน ZSH


189

ฉันกำลังใช้ zsh และฉันกำลังพยายามเพิ่มรายการใหม่ ( /home/david/pear/bin) ลงในPATHตัวแปร แต่ไม่ทราบว่าจะทำอย่างไร

สิ่งที่ทำให้ฉันสับสนมากที่สุดคือไม่มีการอ้างอิงPATHตัวแปรใน~/.zshrcไฟล์ของฉันแต่ทำการecho $PATHส่งคืน:

/usr/lib/lightdm/lightdm:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games

ดังนั้นPATHตัวแปรจึงถูกกำหนดไว้ที่ไหนซักแห่ง

คำตอบ:


214

ที่นี่เพิ่มบรรทัดนี้ไปที่.zshrc:

export PATH=/home/david/pear/bin:$PATH

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


29
ฮ่าฮ่าลืมมันฉันว่านั่นเป็นเพียงคำสั่งคอนโซล แต่การเพิ่มบรรทัดนั้นใน. zshrc ทำเคล็ดลับ ขอบคุณมาก!
David Barreto

1
. zshrc ของฉันมีบรรทัดสำหรับการส่งออก PATH ดังนั้นฉันจึงแทนที่ด้วยการแก้ไข
Zack Huston

6
ฉันต้องลบเครื่องหมายคำพูดคู่รอบรายการเช่นPATH="/home/david/pear/bin:/usr/bin:etc"เพื่อPATH=/home/david/pear/bin:/usr/bin:etcให้อยู่ใน zshrc
a7omiton

3
@taco คุณสามารถใช้ $ HOME
mencargo

1
@DanielSpringer: ใช่ เมื่อคุณเปิดเชลล์เชลล์จะสืบทอดPATHจากกระบวนการพาเรนต์ที่เริ่มต้นขึ้นและเมื่อมันทำงาน.zshrc( .bashrcหรืออะไรก็ตาม) นั่นคือสิ่งที่ช่วยให้คุณเพิ่มสิ่งพิเศษลงในพา ธ นั้นได้
Linuxios

224

ที่จริงแล้วการใช้ ZSH ช่วยให้คุณใช้การทำแผนที่พิเศษของตัวแปรสภาพแวดล้อม ดังนั้นคุณสามารถทำได้:

# append
path+=('/home/david/pear/bin')
# or prepend
path=('/home/david/pear/bin' $path)
# export to sub-processes (make it inherited by child processes)
export PATH

สำหรับฉันนั่นเป็นคุณสมบัติที่เรียบร้อยมากซึ่งสามารถถ่ายทอดไปยังตัวแปรอื่น ๆ ได้ ตัวอย่าง:

typeset -T LD_LIBRARY_PATH ld_library_path :

16
คำตอบที่ดี ในกรณีของฉัน~/.zshrcมีที่มาหลังจากและเขียนทับทุกอย่างใน.profile .profileใช้เวลาสักครู่ดึงผมเพื่อคิดออก
Khanh Nguyen

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

1
@SuperUberDuper คุณควรเข้าใจว่ายูนิกซ์เชลล์เกือบทุกอันจะอ่านไฟล์เริ่มต้นซึ่งทำหน้าที่เหมือนกับว่าคุณพิมพ์ลงในเชลล์แบบโต้ตอบ เกี่ยวกับไฟล์ "rc" คุณอาจพบคำตอบที่น่าสนใจสำหรับคำถามนี้
ony

6
เป็นไปได้ที่จะหลีกเลี่ยงการเอ็กซ์พอร์ตอย่างชัดเจนด้วย-xและปล่อยเฉพาะค่าที่ไม่ซ้ำกันในตัวแปรด้วย-U, โคลอนจะถูกสันนิษฐานโดยค่าเริ่มต้น, ดังนั้นจึงอาจเป็น:typeset -TUx PATH path
ความเศร้าโศก

2
@DanielSpringer หมายเลข หากคุณต้องการในเงื่อนไขเหล่านั้นแล้ว: path=(...)(โดยไม่มีการอ้างอิง$pathหรือ$PATHภายใน) มอบหมาย, การเสริมpath=(... $path)และpath+(...)ผนวก
ony

40

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

path+=/some/new/bin/dir

การใช้งานทั่วไป

จากนั้นรูปแบบทั่วไปสำหรับการทดสอบสคริปต์ / ปฏิบัติการใหม่จะกลายเป็น:

path+=$PWD/.
# or
path+=$PWD/bin

ไวยากรณ์ตัวพิมพ์เล็กนี้ใช้pathเป็นอาร์เรย์แต่ยังมีผลกับคู่ค้าที่เป็นตัวพิมพ์เล็กด้วยเช่นกันPATH(ซึ่งมีการ "ผูก" ผ่านtypeset)

(ขอให้สังเกตว่าไม่:จำเป็น / ต้องการเป็นตัวคั่น )

เกร็ดความรู้ที่เกี่ยวข้อง

การปฏิบัติpathเช่นนี้ (ในรูปแบบอาร์เรย์) หมายถึง: ไม่จำเป็นต้องทำ rehashเพื่อหาคำสั่งที่มีการกำหนดพา ธ ใหม่

ดูvared pathวิธีการแก้ไขpath และสิ่งอื่น ๆ

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

คุณสามารถป้องกันไม่ให้PATHทำซ้ำกับรายการ (อ้างอิงถึง สิ่งนี้ และสิ่งนี้ ):

typeset -U path

ไม่ควรเป็น 'path + =: / foo / bar' (กับลำไส้ใหญ่)
andrew lorien

1
@andrewlorien ฉันอัพเดตคำตอบพร้อมรายละเอียดเกี่ยวกับตัวคั่นลำไส้ใหญ่
คาเอลเลียต

path+='my/path' # for funโปรดทราบว่าถ้ามีความคิดเห็นหลังจากเส้นทางแล้วเราจะทำคำพูดที่จำเป็นเช่น เห็นได้ชัดว่าคุณมีช่องว่าง แต่ไม่มากถ้าคุณมีความคิดเห็น
Franklin Yu

"(โปรดสังเกตว่าไม่จำเป็นต้องมี / ต้องการเป็นตัวคั่น) นี่เป็นจริงสำหรับตัวพิมพ์เล็กpathเท่านั้น :จำเป็นต้องมีก่อนหน้านี้PATHดังต่อไปนี้ใน. zshrc PATH+=:/Users/path/to/my/folder
Emmett R.

37

หนึ่งซับโดยไม่ต้องเปิด~/.zshrcไฟล์

echo -n 'export PATH=~/bin:$PATH' >> ~/.zshrc

หรือ

echo -n 'export PATH=$HOME/bin:$PATH' >> ~/.zshrc

หากต้องการดูเอฟเฟกต์ให้ทำsource ~/.zshrcในแท็บเดียวกันหรือเปิดแท็บใหม่


1
ทำงานอย่างสมบูรณ์แบบบน OSX ด้วย Zsh shell
สไตรเกอร์

1
ทำงานเหมือนจับใจ!
Akbar Sha Ebrahim

15
  1. เพิ่มพา ธ ไปที่ ~ / .zshrc

    sudo vi ~/.zshrc

    เพิ่มเส้นทางใหม่

    export PATH="$PATH:[NEW_DIRECTORY]/bin"
  2. อัปเดต ~ / .zshrc

    บันทึก ~ / .zshrc

    source ~/.zshrc

  3. ตรวจสอบเส้นทาง

    echo $PATH


2
นี่คือBashวิธี
CousinCocaine

13

ตัวเลือก 1:เพิ่มบรรทัดนี้ใน ~ / .zshrc:

export "PATH=$HOME/pear/bin:$PATH"

หลังจากนั้นคุณต้องเรียกใช้source ~/.zshrcเพื่อให้การเปลี่ยนแปลงของคุณมีผลหรือปิดหน้าต่างนี้และเปิดใหม่

ตัวเลือก 2:ดำเนินการภายในคอนโซลเทอร์มินัลเพื่อเพิ่มพา ธ นี้ไปยังเซสชันหน้าต่างเทอร์มินัลปัจจุบันเท่านั้น เมื่อคุณปิดหน้าต่าง / เซสชันมันจะหายไป


คุณช่วยอธิบายได้ไหมว่าคำตอบนี้แตกต่างจากคำตอบเดิมที่โพสต์เมื่อ 5 ปีที่แล้วหรือไม่?
Franklin Yu

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