OSXでのEmacsとコマンドラインの$ PATHの不一致


17

PATHHaskell環境に影響を与えるEmacsの設定に関する問題がある:

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を起動してandにアクセスするshellwhich cabal、次のように/usr/bin/cabalなります。バージョンが異なるため、問題が発生しています。

echo $PATHEmacsから検査するとshell、次のように表示されます。/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/Users/g/Library/Haskell/bin:/usr/local/sbin

いったいどうPATH違うのか分からない...

誰も私のZSHシェルとEmacsが同じことに同意する方法を知っていますPATHか?それがどこcabalからロードされるかを制御しているのではないかと思う。

更新echo $SHELLEmacsの出力から実行:/bin/zsh

更新2:これはOSX上にあります。

更新3exec-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...私のデフォルトのシェルを変更するために戻って一日中
ギャルダーZamarreño

私は...ところでiTerm2を使用しています
ギャルダーZamarreño

2
どうやら、中にPATHを変更していない~/.profileか、/etc/profileそれから。
wasamasa

1
で環境変数を設定します~/.zshenv。これは、シェルが開始されても一貫してソースされます(インタラクティブと非インタラクティブ)。exec-path-from-shell端末のテーマの色が台無しになっている場合は、呼び出す前にに設定exec-path-from-shell-argumentsして、zsh構成のインタラクティブな部分が実行されていないことを確認できます。nilexec-path-from-shell-initialize
sanityinc

回答:



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

皆さんありがとう!!


$PATHOSXの投稿に関するこれについてのヒントをbeOnに感謝します。
ガルダーザマレーニョ

2
より良い解決策は、のパスを変更することです~/.zshenv。EmacsのPATHにあっ反映されている変更
ギャルダーZamarreño

単純に実行echo export PATH=$PATH > ~/.zshenvするM-x shellと、次の呼び出しでEmacsがそれを取得することを確認できます。
ライナスアーバー

5

GUI環境(gnome、kdeなど)からemacsを起動する場合、シェル起動スクリプトは環境に取り込まれません。したがって、$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を使用していると鋭いコメント者が指摘しています。$PATHMac GUIでのセットアップ方法はわかりませんが、シェルの環境とGUI環境の違いについてはまだポイントがあります。$PATHGUIの設定方法は、OSのバージョンに依存するようです。ただし、次を使用できます。

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

あなたに~/.emacs.d/initあなただけ動作するはずソリューションをしたい場合。

PPS:emacsでシェルを実行したい場合、おそらくを使用するansi-termよりもを使用した方がよいでしょうshell


質問者がiTerm 2の使用に言及していることを考えると、質問はLinuxについてだとは思いません。
wasamasa

3

PATHの一部が失われた場合は、〜/ .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の問題を回避するために、〜/ .bashrcからエクスポートされたPATHを使用して、常にコマンドラインからemacsを起動します。


2

これを実現する別の方法は、シェルにログインシェルであることを単純に伝えて、すべての適切なファイルを取得することです。に設定explicit-bash-argsして、bashでこれを行います("--noediting" "--login")。zshに相当するものはに設定explicit-zsh-argsするように見え("-l")ます。

だから私の.emacs

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

あなたのものでは、次のようなものです:

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

これ"--noediting"は不要だと思いますし、これについてzshに伝える方法はないようですが、これがうまくいかない場合は調査する必要があるかもしれません。


1
これは、Emacsで実行されるシェルで機能します。viaなど、Emacs内で直接実行されるコマンドでは機能しませんM-x shell-command
メルンスト

1

たとえば、次のようなプロパティリストを保存して、OS X全体のデフォルトパスを設定することもできます~/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>

ログアウトしてから再度ログインすると、シェル、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.