Emacs และบรรทัดคำสั่ง $ PATH ไม่เห็นด้วยบน OSX


18

มีปัญหาบางอย่างกับPATHการตั้งค่าบน Emacs ที่ส่งผลกระทบต่อสภาพแวดล้อม Haskell ของฉัน:

ฉันใช้ ZSH และเมื่อฉันไปที่บรรทัดคำสั่งและการโทรecho $PATHมันจะคืนค่า:/Users/g/Library/Haskell/bin:/usr/local/bin:/usr/local/sbin:/usr/bin:/bin:/usr/sbin:/sbin

นี่มาจาก.zprofileการกำหนดค่าที่ฉันมี:

# Set the list of directories that Zsh searches for programs.
path=(
  ~/Library/Haskell/bin
  /usr/local/{bin,sbin}
  $path
)

ดังนั้นจากบรรทัดคำสั่งเมื่อฉันโทรwhich cabalฉันได้รับ:/Users/g/Library/Haskell/bin/cabal

เมื่อฉันเริ่ม Emacs และไปที่shellและโทรwhich cabalฉันได้รับ: /usr/bin/cabalซึ่งทำให้ฉันมีปัญหาเนื่องจากเป็นรุ่นที่แตกต่าง

เมื่อฉันตรวจสอบecho $PATHจาก Emacs shellฉันเห็น:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/Users/g/Library/Haskell/bin:/usr/local/sbin

ฉันไม่รู้ว่าPATHจะแตกต่างอย่างไรในโลก...

ใครรู้วิธีทำให้ZSHเชลล์และ Emacs ของฉันเห็นด้วยในสิ่งเดียวกันPATH? ฉันสงสัยว่าเป็นสิ่งที่ควบคุมว่าcabalจะโหลดจากที่ใด

UPDATE : การเรียกใช้echo $SHELLจาก Emacs จะพิมพ์ออกมา:/bin/zsh

UPDATE 2 : นี้คือบนOSX

UPDATE 3 : ฉันพยายามใช้โมดูลexec-path-from-shellแล้ว แต่มันไม่ทำงาน ฉันยังคงมีปัญหาเดียวกันและเป็นผลข้างเคียงมันทำให้สีชุดรูปแบบเทอร์มินัลของฉันยุ่ง :(

อัปเดต 4 : ฉันได้ติดตั้ง Emacs ผ่านbrew install --cocoa --srgb emacsและฉันเรียกใช้ emacs ที่เชื่อมโยงด้วยวิธีนี้:

~ ❯❯❯ which emacs
/usr/local/bin/emacs
~ ❯❯❯ l /usr/local/bin/emacs
lrwxr-xr-x  1 g  admin    30B 29 Jan 18:34 /usr/local/bin/emacs -> ../Cellar/emacs/24.4/bin/emacs
~ ❯❯❯ l /usr/local/Cellar/emacs/24.4/bin/emacs
-r-xr-xr-x  1 g  admin    87B 29 Jan 18:34 /usr/local/Cellar/emacs/24.4/bin/emacs

คุณใช้ ZSH เป็นเชลล์ล็อกอินของคุณหรือไม่
wasamasa

ไม่แน่ใจว่าสิ่งที่คุณหมายถึงโดยเปลือกเข้าสู่ระบบอย่างแน่นอน แต่ฉันเดาว่าฉันโทรchsh...กลับในวันที่จะเปลี่ยนเปลือกเริ่มต้นของฉัน
Galder Zamarreño

ฉันใช้ iTerm2 btw ...
Galder Zamarreño

2
ไม่ชัดเจนแก้ไข PATH ใน~/.profileหรือ/etc/profileจากนั้น
wasamasa

1
ตั้งค่าตัวแปรสภาพแวดล้อมของคุณ~/.zshenvซึ่งจะมีแหล่งมาอย่างต่อเนื่อง แต่เชลล์เริ่มต้นขึ้น (แบบโต้ตอบกับแบบไม่โต้ตอบ) หากexec-path-from-shellสีของชุดรูปแบบเทอร์มินัลของคุณยุ่งเหยิงคุณสามารถตั้งค่าexec-path-from-shell-argumentsเป็นnilก่อนเรียกexec-path-from-shell-initializeเพื่อให้แน่ใจว่าไม่ได้รันส่วนโต้ตอบของการกำหนดค่า zsh ของคุณ
sanityinc

คำตอบ:


14

คุณยังสามารถติดตั้งแพคเกจ exec-path-from-shellและเพิ่มลงในไฟล์ init ของคุณ:

(exec-path-from-shell-initialize)

1
คำถามที่จะดีกว่าที่มีการเชื่อมโยงไปยังแพคเกจที่อ้างถึง
ดึง

ถูกต้องฉันเพิ่งแก้ไขคำตอบของฉัน
Basak

1
นี่คือทั้งหมดที่ฉันต้องการ
djhaskin987

8

นี่เป็นปัญหาสิ่งแวดล้อม OSX ที่น่ารำคาญ$PATHปรากฏใน Emacs มาจาก/etc/pathsไฟล์ซึ่งต่อท้ายกับสิ่งที่ฉันตั้งไว้ในเปลือก ฉันเพิ่ม/Users/g/Library/Haskell/binไปที่ด้านบนของ/etc/pathsไฟล์แล้วก็ใช้ได้ดี

การเข้าสู่เชลล์และการโทรecho $PATHใน Emacs จะแสดงทันที:/Users/g/Library/Haskell/bin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/sbin

และcabalเวอร์ชั่นของมันก็คือcabal-install version 1.22.2.0: D

ขอบคุณทุกคน !!


ขอบคุณที่เป็นคำแนะนำของเขาในโพสต์$PATH OSX นี้
Galder Zamarreño

2
~/.zshenvทางออกที่ดีคือการปรับเปลี่ยนเส้นทางใน การเปลี่ยนแปลงที่เกิดขึ้นในเส้นทางของ Emacs
Galder Zamarreño

ฉันสามารถยืนยันได้ว่าการดำเนินการเพียงอย่างเดียวecho export PATH=$PATH > ~/.zshenvทำให้ Emacs มาM-x shellรับในการเรียกใช้ครั้งต่อไป
Linus Arver

5

หากคุณเริ่ม emacs จากสภาพแวดล้อม GUI ของคุณ (gnome, kde, ... ) สคริปต์การเริ่มต้นเชลล์ของคุณจะไม่ได้รับแหล่งที่มาในสภาพแวดล้อมของคุณ ดังนั้นสิ่ง$PATHที่คุณตั้งไว้อย่างรอบคอบ.zshจะไม่ถูกโหลด สภาพแวดล้อม GUI ไม่ได้มาจากแหล่งเหล่านี้แม้ว่าพวกเขาอาจโหลด~/.profileไฟล์ของคุณ

คุณสามารถลองเพิ่มลงในของคุณ.pam_environment:

PATH DEFAULT=${PATH}:/MYHOMEDIR/Library/Haskell/bin:/usr/local/bin:/usr/local/sbin

คุณจะต้องรีสตาร์ทเซสชัน GUI เพื่อโหลด

เอกสารนี้อาจช่วยให้คุณ$PATHตั้งค่าตัวแปรอย่างเหมาะสม:

https://help.ubuntu.com/community/EnvironmentVariables#Session-wide_environment_variables

ฉันใช้~/.pam_environmentไฟล์เพื่อตัวแปรสภาพแวดล้อมที่มีการจัดการที่ฉันต้องสามารถเข้าถึงได้จากกระบวนการเชลล์หรือ emacs ของฉัน

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

(setenv "PATH" (concat (getenv "PATH") ":/foo/bar"))

ในของคุณ~/.emacs.d/initถ้าคุณเพียงต้องการแก้ปัญหาที่ควรทำงาน

PPS: ถ้าคุณต้องการที่จะใช้เปลือกใน emacs คุณอาจจะดีกว่าการใช้มากกว่าansi-termshell


ฉันสงสัยคำถามที่เป็นเรื่องเกี่ยวกับลินุกซ์ได้รับการถามที่กล่าวถึงการใช้งานของiTerm 2
wasamasa

3

หากเส้นทางบางส่วนหายไปคุณสามารถเพิ่มใน ~ / .emacs ของคุณ

;;; We add /path/to/something/extra by appending it to the path
(setenv "PATH" (concat (getenv "PATH") ":/path/to/something/extra"))
;;; /path/to/something/extra is now at the end of the PATH.
;;; or you can use:
;(setenv "PATH" (concat "/path/to/something/extra:" (getenv "PATH")))
;;; /path/to/something/extra is now at the beginning of the PATH.

เพื่อหลีกเลี่ยงปัญหา PATH ฉันมักจะเริ่ม emacs จากบรรทัดคำสั่งด้วย PATH ที่ส่งออกจาก ~ / .bashrc


2

อีกวิธีหนึ่งในการทำสิ่งนี้ให้สำเร็จคือเพียงแค่บอกเชลล์ว่าเป็นเชลล์ล็อกอินเพื่อให้ได้มาซึ่งไฟล์ที่ถูกต้องทั้งหมด ฉันทำเช่นนี้สำหรับทุบตีโดยการตั้งค่าไปexplicit-bash-args ("--noediting" "--login")ดูเหมือนว่าเทียบเท่าสำหรับ zsh จะเป็นชุดที่จะexplicit-zsh-args("-l")

ดังนั้นในของฉัน.emacs:

(setq explicit-bash-args '("--noediting" "--login"))

ในของคุณบางอย่างเช่น:

(setq explicit-zsh-args '("-l"))

ฉันคิดว่า"--noediting"มันไม่จำเป็นและดูเหมือนจะไม่มีวิธีที่จะบอก zsh เกี่ยวกับสิ่งนี้ แต่นั่นอาจเป็นสิ่งที่จะตรวจสอบว่าสิ่งนี้ทำงานได้ไม่ดีเท่าที่คุณต้องการ


1
ใช้งานได้กับเชลล์ที่ทำงานภายใต้ Emacs มันไม่ทำงานสำหรับคำสั่งเรียกใช้โดยตรงภายใน Emacs M-x shell-commandเช่นผ่านทาง
mernst

1

คุณยังสามารถตั้งค่าพา ธ เริ่มต้นของ OS X-wide ได้ด้วยตัวอย่างเช่นการบันทึกรายการคุณสมบัติเช่น~/Library/LaunchAgents/my.startup.plist:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
  <key>Label</key>
  <string>my.startup</string>
  <key>ProgramArguments</key>
  <array>
    <string>sh</string>
    <string>-c</string>
    <string>launchctl setenv PATH /usr/local/bin:/usr/local/sbin:/usr/bin:/bin:/usr/sbin:/sbin</string>
  </array>
  <key>RunAtLoad</key>
  <true/>
</dict>
</plist>

เส้นทางใหม่ควรแสดงใน shells, Emacs และแอพพลิเคชั่นอื่น ๆ หลังจากที่คุณออกจากระบบและกลับเข้ามาใหม่

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

ใน 10.9 และก่อนหน้านี้คุณยังสามารถเพิ่มบรรทัดเช่นนี้ใน/etc/launchd.conf:

setenv PATH /usr/local/bin:/usr/local/sbin:/usr/bin:/bin:/usr/sbin:/sbin

อย่างไรก็ตามการสนับสนุน/etc/launchd.confถูกลบออกใน 10.10

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