Emacs và dòng lệnh $ PATH bất đồng về OSX


17

Có một số vấn đề với PATHcài đặt trên Emacs đang ảnh hưởng đến môi trường Haskell của tôi:

Tôi đang sử dụng ZSH và khi tôi đi đến dòng lệnh và gọi echo $PATH, nó sẽ trả về:/Users/g/Library/Haskell/bin:/usr/local/bin:/usr/local/sbin:/usr/bin:/bin:/usr/sbin:/sbin

Điều này đến từ .zprofilecấu hình mà tôi có:

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

Vì vậy, từ dòng lệnh, khi tôi gọi which cabal, tôi nhận được chính xác:/Users/g/Library/Haskell/bin/cabal

Khi tôi khởi động Emacs và đi đến shellvà gọi which cabal, tôi nhận được: /usr/bin/cabalđiều này khiến tôi gặp vấn đề vì đây là phiên bản khác.

Khi tôi kiểm tra echo $PATHtừ Emacs shell, tôi thấy:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/Users/g/Library/Haskell/bin:/usr/local/sbin

Tôi không biết làm thế nào trên trái đất PATHcó thể khác ...

Bất cứ ai cũng biết làm thế nào để có được ZSHvỏ của tôi và Emacs đồng ý như nhau PATH? Tôi nghi ngờ đó là những gì kiểm soát nơi cabalđược tải từ.

CẬP NHẬT : Chạy echo $SHELLtừ bản in Emacs:/bin/zsh

CẬP NHẬT 2 : Đây là trên OSX .

CẬP NHẬT 3 : Tôi đã thử sử dụng mô-đun exec-path-from-shell và nó không hoạt động. Tôi vẫn có vấn đề tương tự, và như một tác dụng phụ, nó làm rối tung màu sắc chủ đề thiết bị đầu cuối của tôi :(

CẬP NHẬT 4 : Tôi đã cài đặt Emacs thông qua brew install --cocoa --srgb emacsvà tôi chạy các emacs được liên kết theo cách này:

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

Bạn đang sử dụng ZSH làm vỏ đăng nhập?
wasamasa

Không chắc chắn ý của bạn bằng cách đăng nhập shell chính xác, nhưng tôi đoán rằng tôi đã gọi chsh...lại trong ngày để thay đổi shell mặc định của mình
Galder Zamarreño

Tôi đang sử dụng iTerm2 btw ...
Galder Zamarreño

2
Rõ ràng là không, sửa đổi PATH trong ~/.profilehoặc /etc/profilesau đó.
wasamasa

1
Đặt các biến môi trường của bạn ~/.zshenv, sẽ có nguồn gốc nhất quán tuy nhiên trình bao được bắt đầu (tương tác so với không tương tác). Nếu exec-path-from-shelllàm rối màu sắc chủ đề thiết bị đầu cuối của bạn, bạn có thể đặt exec-path-from-shell-argumentsthành niltrước khi gọi exec-path-from-shell-initializeđể đảm bảo rằng nó không chạy các phần tương tác trong cấu hình zsh của bạn.
sanityinc

Câu trả lời:



8

Đây là một vấn đề môi trường gây phiền nhiễu OSX, sự $PATHxuất hiện trong Emacs xuất phát từ /etc/pathstệp, sau đó sẽ được thêm vào bất cứ thứ gì tôi đã đặt trong trình bao. Tôi đã thêm vào /Users/g/Library/Haskell/binđầu /etc/pathstập tin và sau đó nó hoạt động tốt.

Đi vào vỏ và gọi echo $PATHtrong chương trình Emacs bây giờ:/Users/g/Library/Haskell/bin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/sbin

cabalphiên bản thực sự là cabal-install version 1.22.2.0: D

Cảm ơn tất cả!!


Cảm ơn beOn vì những gợi ý của anh ấy trong bài viết này $PATHvề OSX .
Galder Zamarreño

2
Một giải pháp tốt hơn là sửa đổi đường dẫn trong ~/.zshenv. Những thay đổi được phản ánh trong PATH của Emacs
Galder Zamarreño

Tôi có thể xác nhận rằng chỉ cần thực hiện sẽ echo export PATH=$PATH > ~/.zshenvkhiến Emacs M-x shellnhận nó trong lần gọi tiếp theo.
Linus Arver

5

Nếu bạn bắt đầu emacs từ môi trường GUI của bạn (gnome, kde, ...) thì các tập lệnh khởi động shell của bạn sẽ không có nguồn gốc từ môi trường của bạn. Vì vậy, cái $PATHmà bạn cẩn thận đặt trong .zshsẽ không được tải. Các môi trường GUI thường không cung cấp nguồn này, mặc dù chúng có thể tải ~/.profiletệp của bạn .

Bạn có thể thử thêm phần này vào .pam_environment:

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

Bạn sẽ cần phải khởi động lại phiên GUI của bạn để tải nó.

Tài liệu này có thể giúp bạn $PATHđặt biến của mình đúng cách:

https://help.ubfox.com/community/EnvirVariables#Session- Worldwide_envir_variables

Tôi sử dụng ~/.pam_environmenttệp để quản lý các biến môi trường mà tôi cần có thể truy cập được từ các quy trình shell hoặc emacs của mình.

PS: Một nhà bình luận sắc sảo chỉ ra rằng bạn có thể đang ở trên Mac. Tôi không biết cách thiết lập $PATHGUI của bạn trong Mac, nhưng vấn đề vẫn còn liên quan đến sự khác biệt giữa môi trường shell của bạn và môi trường GUI. Cách bạn thiết lập $PATHcho GUI dường như phụ thuộc vào phiên bản HĐH. Tuy nhiên, bạn có thể sử dụng:

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

trong của bạn ~/.emacs.d/initnếu bạn chỉ muốn một giải pháp nên làm việc.

PPS: Nếu bạn muốn chạy một vỏ trong emacs, bạn có lẽ tốt hơn sử dụng ansi-termhơn shell.


Tôi nghi ngờ câu hỏi là về Linux khi người hỏi đề cập đến việc sử dụng iTerm 2 .
wasamasa

3

Nếu một phần của PATH bị mất thì bạn có thể thêm nó vào ~ / .emacs của bạn

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

Để tránh các vấn đề về PATH, tôi luôn bắt đầu các emacs từ dòng lệnh với PATH được xuất từ ​​~ / .bashrc.


2

Một cách khác để thực hiện điều này là chỉ cần nói với shell rằng đó là shell đăng nhập để nó cung cấp tất cả các tệp đúng. Tôi làm điều này cho bash bằng cách thiết lập explicit-bash-argsđể ("--noediting" "--login"). Có vẻ như tương đương với zsh sẽ được đặt explicit-zsh-argsthành ("-l").

Vì vậy, trong tôi .emacs:

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

Trong bạn, một cái gì đó như:

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

Tôi nghĩ rằng điều đó "--noediting"là không cần thiết, và dường như không có cách nào để nói với zsh về điều này, nhưng đó có thể là điều cần điều tra nếu điều này không hoạt động tốt như bạn hy vọng.


1
Điều này hoạt động cho một vỏ chạy dưới Emacs. Nó không hoạt động đối với các lệnh chạy trực tiếp trong Emacs, chẳng hạn như thông qua M-x shell-command.
vào

1

Bạn cũng có thể đặt đường dẫn mặc định trên toàn hệ điều hành X bằng cách lưu danh sách thuộc tính như sau ~/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>

Đường dẫn mới sẽ được hiển thị trong shell, Emacs và các ứng dụng khác sau khi bạn đăng xuất và đăng nhập lại.

Phương pháp này không thay đổi đường dẫn trong các ứng dụng được mở dưới dạng các mục đăng nhập hoặc khi các ứng dụng được mở lại khi đăng nhập sau khi tắt máy. Nếu bạn có Emacs, ứng dụng đầu cuối hoặc các ứng dụng khác mà bạn muốn thay đổi đường dẫn trong các mục đăng nhập, bạn sẽ phải xóa chúng.

Trong 10.9 trở về trước, bạn cũng có thể thêm một dòng như thế này vào /etc/launchd.conf:

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

Tuy nhiên, hỗ trợ /etc/launchd.confđã được gỡ bỏ trong 10.10.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.