Emacs dan baris perintah $ PATH ketidaksepakatan pada OSX


18

Mengalami beberapa masalah dengan PATHpengaturan pada Emacs yang memengaruhi lingkungan Haskell saya:

Saya menggunakan ZSH, dan ketika saya pergi ke baris perintah dan menelepon echo $PATH, ia kembali:/Users/g/Library/Haskell/bin:/usr/local/bin:/usr/local/sbin:/usr/bin:/bin:/usr/sbin:/sbin

Ini berasal dari .zprofilekonfigurasi tempat saya memiliki:

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

Jadi, dari baris perintah, ketika saya menelepon which cabal, saya mendapatkan:/Users/g/Library/Haskell/bin/cabal

Ketika saya memulai Emacs dan pergi ke shelldan menelepon which cabal, saya mendapatkan: /usr/bin/cabalyang menyebabkan saya masalah karena ini versi yang berbeda.

Ketika saya memeriksa echo $PATHdari Emacs shell, saya melihat:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/Users/g/Library/Haskell/bin:/usr/local/sbin

Saya tidak tahu bagaimana PATHbisa berbeda ...

Adakah yang tahu bagaimana cara mendapatkan ZSHshell saya dan Emacs untuk menyetujui hal yang sama PATH? Saya menduga itulah yang mengendalikan dari mana cabalsedang diambil.

UPDATE : Menjalankan echo $SHELLdari cetakan Emacs:/bin/zsh

UPDATE 2 : Ini ada di OSX .

PEMBARUAN 3 : Saya telah mencoba menggunakan modul exec-path-from-shell dan tidak berfungsi. Saya masih memiliki masalah yang sama, dan sebagai efek samping, itu mengacaukan warna tema terminal saya :(

PEMBARUAN 4 : Saya telah menginstal Emacs via brew install --cocoa --srgb emacsdan saya menjalankan emacs yang ditautkan dengan cara ini:

~ ❯❯❯ 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

Apakah Anda menggunakan ZSH sebagai shell login Anda?
wasamasa

Tidak yakin apa yang Anda maksud dengan shell login persis, tapi saya kira saya menelepon chsh...kembali pada hari itu untuk mengganti shell default saya
Galder Zamarreño

Saya menggunakan iTerm2 btw ...
Galder Zamarreño

2
Ternyata tidak, modifikasi PATH di ~/.profileatau /etc/profilekemudian.
wasamasa

1
Tetapkan variabel lingkungan Anda ~/.zshenv, yang akan diambil secara konsisten namun shell dimulai (interaktif vs. non-interaktif). Jika exec-path-from-shelladalah mengacaukan warna tema terminal Anda, Anda dapat mengatur exec-path-from-shell-argumentsuntuk nilsebelum memanggil exec-path-from-shell-initializeuntuk memastikan itu tidak berjalan bagian interaktif config zsh Anda.
sanityinc

Jawaban:



8

Ini adalah masalah lingkungan OSX yang mengganggu, $PATHkemunculan di Emacs berasal dari /etc/pathsfile, yang kemudian ditambahkan dengan apa pun yang saya atur di shell. Saya menambahkan /Users/g/Library/Haskell/binke bagian atas /etc/pathsfile dan kemudian berfungsi dengan baik.

Masuk ke shell dan menelepon echo $PATHdi Emacs menunjukkan sekarang:/Users/g/Library/Haskell/bin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/sbin

Dan cabalversi ini memang cabal-install version 1.22.2.0: D

Terima kasih semuanya!!


Terima kasih untuk menjadi On untuk petunjuknya dalam hal ini $PATHdi OSX post .
Galder Zamarreño

2
Solusi yang lebih baik adalah memodifikasi path di ~/.zshenv. Perubahan di sana tercermin dalam PATH Emacs
Galder Zamarreño

Saya dapat mengkonfirmasi bahwa hanya dengan melakukan itu, echo export PATH=$PATH > ~/.zshenvEmacs akan M-x shellmengambilnya pada doa berikutnya.
Linus Arver

5

Jika Anda memulai emacs dari lingkungan GUI Anda (gnome, kde, ...) skrip startup shell Anda tidak akan bersumber dari lingkungan Anda. Sehingga $PATHAnda hati-hati mengatur di Anda .zshtidak akan dimuat. Lingkungan GUI umumnya tidak sumber ini, meskipun mereka dapat memuat ~/.profilefile Anda .

Anda dapat mencoba menambahkan ini ke .pam_environment:

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

Anda harus memulai kembali sesi GUI Anda untuk memuatnya.

Dokumen ini mungkin membantu Anda $PATHmengatur variabel dengan benar:

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

Saya menggunakan ~/.pam_environmentfile untuk variabel lingkungan terkelola yang saya perlukan agar dapat diakses dari proses shell atau emacs saya.

PS: Seorang komentator yang cerdik menunjukkan bahwa Anda mungkin menggunakan Mac. Saya tidak tahu cara mengatur Anda $PATHdi Mac GUI, tetapi intinya masih berdiri mengenai perbedaan antara lingkungan shell Anda dan lingkungan GUI. Bagaimana Anda mengatur $PATHGUI tampaknya tergantung pada versi OS. Namun Anda dapat menggunakan:

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

di Anda ~/.emacs.d/initjika Anda hanya menginginkan solusi yang seharusnya bekerja.

PPS: Jika Anda ingin menjalankan shell di emacs, Anda mungkin lebih baik menggunakan ansi-termdaripada shell.


Saya ragu pertanyaannya adalah tentang Linux mengingat penanya menyebutkan penggunaan iTerm 2 .
wasamasa

3

Jika beberapa bagian PATH hilang, Anda dapat menambahkannya di ~ / .emacs Anda

;;; 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.

Untuk menghindari masalah PATH, saya selalu memulai emacs dari baris perintah dengan PATH diekspor dari ~ / .bashrc.


2

Cara lain untuk mencapai hal ini adalah dengan memberi tahu shell bahwa itu adalah shell login sehingga sumber semua file yang tepat. Saya melakukan ini untuk bash dengan mengatur explicit-bash-argske ("--noediting" "--login"). Sepertinya persamaan untuk zsh akan diatur explicit-zsh-argske ("-l").

Jadi di dalam saya .emacs:

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

Di dalam kamu, sesuatu seperti:

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

Saya pikir "--noediting"itu tidak perlu, dan sepertinya tidak ada cara untuk memberitahu zsh tentang ini, tapi itu mungkin sesuatu untuk diselidiki jika ini tidak bekerja sebaik yang Anda harapkan.


1
Ini berfungsi untuk menjalankan shell di bawah Emacs. Ini tidak berfungsi untuk perintah yang dijalankan langsung di dalam Emacs, seperti via M-x shell-command.
mernst

1

Anda juga dapat menetapkan jalur default OS X-wide dengan misalnya menyimpan daftar properti seperti ini sebagai ~/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>

Jalur baru harus ditampilkan di shell, Emacs, dan aplikasi lain setelah Anda logout dan kembali.

Metode ini tidak mengubah jalur dalam aplikasi yang dibuka sebagai item login atau ketika aplikasi dibuka kembali saat login setelah shutdown paksa. Jika Anda memiliki Emacs, aplikasi terminal, atau aplikasi lain di mana Anda ingin mengubah jalur dalam item login, Anda harus menghapusnya.

Di 10.9 dan sebelumnya Anda juga bisa menambahkan baris seperti ini ke /etc/launchd.conf:

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

Namun dukungan untuk /etc/launchd.confdihapus pada 10.10.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.