จะวางการยืนยันตัวแปร $ PATH ใน zsh ได้ที่ไหน?


111

ฉันชอบzshแต่ฉันไม่แน่ใจว่าจะวาง$PATHคำยืนยันของฉันและตัวแปรอื่น ๆ ไว้ที่ไหน? ฉันพบว่ามันกระจัดกระจายระหว่างไฟล์.zshrc .zprofile .bashrc .bash_profileและบางครั้งก็เพิ่มเป็นสองเท่า

ฉันตระหนักดีว่ามีอะไรอยู่ภายในbashไฟล์ไม่ได้ทำให้ความรู้สึกมากเห็นเป็นผมใช้zshแต่ที่ว่าฉันควรจะวางของฉันrvm, python, nodeฯลฯ เพิ่มเติมให้กับฉัน$PATH?

มีไฟล์เฉพาะผมควรจะใช้ (เช่น.zshenvที่ไม่ได้มีอยู่ในปัจจุบันในการติดตั้งของฉัน) ซึ่งเป็นหนึ่งในคนที่ฉันกำลังใช้หรือไม่ได้แม้กระทั่งเรื่อง?

คำตอบ:


148

tl; dr เวอร์ชัน: ใช้ ~/.zshrc

และอ่านหน้าคนเพื่อทำความเข้าใจความแตกต่างระหว่าง:

~/.zshrc, และ~/.zshenv~/.zprofile


เกี่ยวกับความคิดเห็นของฉัน

ในความคิดเห็นของฉันที่แนบมากับคำตอบที่เคฟให้ฉันพูดว่า:

สิ่งนี้ดูเหมือนจะไม่ถูกต้อง - / etc / profile ไม่อยู่ในเอกสาร zsh ใด ๆ ที่ฉันหาได้

นี้จะออกมาเป็นบางส่วนที่ไม่ถูกต้อง: /etc/profile อาจจะ sourced zshโดย อย่างไรก็ตามสิ่งนี้จะเกิดขึ้นzshก็ต่อเมื่อ"เรียกใช้เป็นshหรือksh"; ในโหมดความเข้ากันได้เหล่านี้:

สคริปต์เริ่มต้น / ปิด zsh ตามปกติจะไม่ถูกเรียกใช้งาน ล็อกอินเชลล์ source / etc / profile ตามด้วย $ HOME / .profile ถ้าตัวแปรสภาพแวดล้อม ENV ถูกตั้งค่าตามการเรียกใช้ $ ENV จะมาจากสคริปต์โปรไฟล์ ค่าของ ENV ขึ้นอยู่กับการขยายพารามิเตอร์การแทนที่คำสั่งและการขยายทางคณิตศาสตร์ก่อนที่จะตีความเป็นชื่อพา ธ [ man zshall, "ความเข้ากันได้" ]

ลิงค์ ArchWiki ZSHพูดว่า:

เมื่อเข้าสู่ระบบ Zsh จะจัดหาไฟล์ต่อไปนี้ตามลำดับนี้:
/ etc / profile
ไฟล์นี้มาจากเชลล์ที่เข้ากันได้กับ Bourne ทั้งหมดเมื่อล็อกอิน

implys นี้ที่/etc/profileจะอ่านเสมอโดยzshในการเข้าสู่ระบบ - ฉันไม่ได้มีประสบการณ์กับโครงการ Arch ลินุกซ์; วิกิอาจถูกต้องสำหรับการแจกแจงนั้น แต่โดยทั่วไปแล้วไม่ถูกต้อง ข้อมูลที่เป็นที่ไม่ถูกต้องเมื่อเทียบกับหน้าคู่มือ zsh และดูเหมือนจะไม่นำไปใช้กับ zsh บน OS X (เส้นทางใน$PATHชุด/etc/profileไม่ให้มันไปประชุม zsh ของฉัน)



เพื่อตอบคำถาม:

ฉันควรวาง rvm, python, node และส่วนเพิ่มเติมไว้ที่ใดใน $ PATH ของฉัน

โดยทั่วไปฉันจะส่งออก$PATHจากของฉัน~/.zshrcแต่ก็คุ้มค่าที่จะอ่านหน้าzshall man โดยเฉพาะส่วน "เริ่มต้น / ปิดไฟล์" - ~/.zshrcอ่านสำหรับเชลล์แบบโต้ตอบซึ่งอาจหรือไม่เหมาะกับความต้องการของคุณ - หากคุณต้องการ$PATHสำหรับ ทุกzshเชลล์เรียกใช้โดยคุณ (ทั้งสองอย่างinteractiveและไม่ใช่ทั้งสองอย่างloginและไม่ใช่ ฯลฯ ) ดังนั้นจึง~/.zshenvเป็นตัวเลือกที่ดีกว่า

มีไฟล์เฉพาะที่ฉันควรใช้ (เช่น. zshenv ซึ่งปัจจุบันไม่มีอยู่ในการติดตั้งของฉัน) ไฟล์ใดไฟล์หนึ่งที่ฉันกำลังใช้อยู่หรือมันมีความสำคัญหรือไม่

มีไฟล์จำนวนมากที่อ่านเมื่อเริ่มต้น (ตรวจสอบmanหน้าที่เชื่อมโยง) และมีเหตุผลสำหรับสิ่งนั้น - แต่ละไฟล์มีสถานที่เฉพาะ (การตั้งค่าสำหรับผู้ใช้ทุกคนการตั้งค่าสำหรับผู้ใช้เฉพาะการตั้งค่าสำหรับล็อกอินเชลล์การตั้งค่าสำหรับทุกเชลล์ ฯลฯ )
อย่ากังวลว่าจะ~/.zshenvไม่มีอยู่ - หากคุณต้องการสร้างมันขึ้นมาและจะอ่านได้

.bashrcและ.bash_profileจะไม่ถูกอ่านโดยzshเว้นแต่คุณจะระบุแหล่งที่มาอย่างชัดเจน~/.zshrcหรือคล้ายกัน ไวยากรณ์ระหว่างbashและzshเป็นไม่ได้เข้ากันได้เสมอ ทั้งสองแบบ.bashrcและ.bash_profileออกแบบมาสำหรับbashการตั้งค่าไม่ใช่zshการตั้งค่า


3
ขอบคุณสำหรับคำตอบที่ละเอียดกว่าของคุณ แปลกที่คุณพูด.bashrcและ.bash_profileไม่ได้อ่านโดยzshที่ฉันมีการrvmเพิ่มเข้ามา$PATHใน.bashrcปัจจุบันและการpythonเพิ่มของฉัน.bash_profileและทั้งสองกำลังถูกเพิ่มเข้ามาอย่างดี ไม่ว่าในกรณีใดฉันจะย้ายการ$PATHส่งออก~/.zshrcทั้งหมดไปที่เนื่องจากzshการกำหนดค่าอื่น ๆ ของฉันถูกเก็บไว้ที่นั่น ฉันต้องยอมรับว่าฉันไม่ค่อยคุ้นเคยกับหอยประเภทต่างๆ จากการอ่านลิงก์ที่คุณโพสต์ฉันเดาว่าฉันใช้เชลล์แบบโต้ตอบ แต่ฉันจะอ่านต่อไปเพื่อความแน่ใจ ... ขอบคุณอีกครั้ง!
stefmikhail

30

นี่คือเอกสารจาก zsh man pages ในส่วน STARTUP / SHUTDOWN FILES

   Commands  are  first  read from /etc/zshenv this cannot be overridden.
   Subsequent behaviour is modified by the RCS and GLOBAL_RCS options; the
   former  affects all startup files, while the second only affects global
   startup files (those shown here with an path starting with  a  /).   If
   one  of  the  options  is  unset  at  any point, any subsequent startup
   file(s) of the corresponding type will not be read.  It is also  possi-
   ble  for  a  file  in  $ZDOTDIR  to  re-enable GLOBAL_RCS. Both RCS and
   GLOBAL_RCS are set by default.

   Commands are then read from $ZDOTDIR/.zshenv.  If the shell is a  login
   shell,  commands  are  read from /etc/zprofile and then $ZDOTDIR/.zpro-
   file.  Then, if the  shell  is  interactive,  commands  are  read  from
   /etc/zshrc  and then $ZDOTDIR/.zshrc.  Finally, if the shell is a login
   shell, /etc/zlogin and $ZDOTDIR/.zlogin are read.

จากสิ่งนี้เราจะเห็นว่าไฟล์คำสั่งอ่านคือ:

/etc/zshenv    # Read for every shell
~/.zshenv      # Read for every shell except ones started with -f
/etc/zprofile  # Global config for login shells, read before zshrc
~/.zprofile    # User config for login shells
/etc/zshrc     # Global config for interactive shells
~/.zshrc       # User config for interactive shells
/etc/zlogin    # Global config for login shells, read after zshrc
~/.zlogin      # User config for login shells
~/.zlogout     # User config for login shells, read upon logout
/etc/zlogout   # Global config for login shells, read after user logout file

คุณจะได้รับข้อมูลเพิ่มเติมที่นี่


18

ฉันมีปัญหาที่คล้ายกัน (ในคำสั่ง bash terminal ทำงานอย่างถูกต้อง แต่ zsh แสดงคำสั่งไม่พบข้อผิดพลาด)

สารละลาย:


เพียงแค่วางสิ่งที่คุณวางไว้ก่อนหน้านี้ใน ~ / .bashrc ไปที่:

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