Emacs y línea de comando $ PATH desacuerdos en OSX

18

Tener algunos problemas con la PATHconfiguración en Emacs que están afectando a mi entorno Haskell:

Estoy usando ZSH, y cuando voy a la línea de comando y llamo echo $PATH, me devuelve:/Users/g/Library/Haskell/bin:/usr/local/bin:/usr/local/sbin:/usr/bin:/bin:/usr/sbin:/sbin

Esto viene de la .zprofileconfiguración donde tengo:

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

Entonces, desde la línea de comando, cuando llamo which cabal, obtengo correctamente:/Users/g/Library/Haskell/bin/cabal

Cuando inicio Emacs y voy a shelly llamo which cabal, obtengo: /usr/bin/caballo que me está causando problemas ya que es una versión diferente.

Cuando inspecciono echo $PATHdesde Emacs shell, veo:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/Users/g/Library/Haskell/bin:/usr/local/sbin

No tengo idea de cómo PATHpuede ser diferente ...

¿Alguien sabe cómo lograr que mi ZSHshell y Emacs acuerden lo mismo PATH? Sospecho que eso es lo que controla desde dónde cabalse está cargando.

ACTUALIZACIÓN : Ejecutando echo $SHELLdesde impresiones Emacs:/bin/zsh

ACTUALIZACIÓN 2 : Esto está en OSX .

ACTUALIZACIÓN 3 : He intentado usar el módulo exec-path-from-shell y no funciona. Todavía tengo los mismos problemas y, como efecto secundario, estropea los colores de mi tema terminal :(

ACTUALIZACIÓN 4 : He instalado Emacs a través de brew install --cocoa --srgb emacsy ejecuto emacs que está vinculado de esta manera:

~ ❯❯❯ 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
Galder Zamarreño
fuente
¿Está utilizando ZSH como su shell de inicio de sesión?
wasamasa
No estoy seguro de qué quiere decir exactamente con shell de inicio de sesión, pero supongo que volví a llamar chsh...en el día para cambiar mi shell predeterminado
Galder Zamarreño
Estoy usando iTerm2 por cierto ...
Galder Zamarreño
2
Aparentemente no, modifique PATH en ~/.profileo /etc/profileluego.
wasamasa
1
Establezca sus variables de entorno ~/.zshenv, que se obtendrán de forma coherente sin embargo, se inicia el shell (interactivo frente a no interactivo). Si exec-path-from-shelles echar a perder sus colores del tema terminales, se puede establecer exec-path-from-shell-argumentsque nilantes de llamar exec-path-from-shell-initializepara asegurarse de que no se está ejecutando las partes interactivas de su configuración zsh.
sanityinc

Respuestas:

14

También puede instalar el paquete exec-path-from-shell y agregar esto a su archivo init:

(exec-path-from-shell-initialize)
Basak
fuente
1
La pregunta sería mejor con un enlace al paquete citado .
Dibujó el
Tienes razón, acabo de editar mi respuesta.
Basak
1
Esto es todo lo que siempre quise.
djhaskin987
8

Este es un problema de entorno OSX molesto, la $PATHaparición en Emacs proviene del /etc/pathsarchivo, que luego se agrega con lo que haya configurado en el shell. Agregué /Users/g/Library/Haskell/bina la parte superior del /etc/pathsarchivo y luego funcionó bien.

Entrar en shell y llamar echo $PATHa Emacs muestra ahora:/Users/g/Library/Haskell/bin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/sbin

Y caballa versión es de hecho cabal-install version 1.22.2.0: D

¡¡Gracias a todos!!

Galder Zamarreño
fuente
Gracias a beOn por sus pistas en esta publicación de$PATH OSX .
Galder Zamarreño
2
Una mejor solución es modificar la ruta de acceso ~/.zshenv. Los cambios allí se reflejan en el CAMINO de Emacs
Galder Zamarreño
Puedo confirmar que simplemente haciendo echo export PATH=$PATH > ~/.zshenvque Emacs lo M-x shelltome en la próxima invocación.
Linus Arver
5

Si inicia emacs desde su entorno GUI (gnome, kde, ...), sus scripts de inicio de shell no se incluirán en su entorno. Por lo tanto , no se cargará el $PATHque configuró cuidadosamente .zsh. Los entornos GUI generalmente no los obtienen, aunque pueden cargar su ~/.profilearchivo.

Puedes intentar agregar esto a tu .pam_environment:

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

Deberá reiniciar su sesión de GUI para cargarla.

Este documento puede ayudarlo a obtener su $PATHconjunto de variables correctamente:

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

Utilizo el ~/.pam_environmentarchivo para administrar las variables de entorno a las que necesito acceder desde mis procesos de shell o emacs.

PD: Un comentarista astuto señala que probablemente estés en Mac. No sé cómo configurar su $PATHinterfaz gráfica de usuario de Mac, pero el punto sigue en pie con respecto a la diferencia entre el entorno de su shell y el entorno de la GUI. La configuración $PATHde la GUI parece depender de la versión del sistema operativo. Sin embargo, puedes usar:

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

en tu ~/.emacs.d/initsi solo quieres una solución que debería funcionar.

PPS: si desea ejecutar un shell en emacs, probablemente sea mejor usarlo ansi-termque hacerlo shell.

Erik Hetzner
fuente
Dudo que la pregunta sea sobre Linux dado que el interrogador mencionó el uso de iTerm 2 .
wasamasa
3

Si alguna parte de la RUTA se pierde, puede agregarla en su ~ / .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.

Para evitar problemas de RUTA, siempre inicio emacs desde la línea de comandos con la RUTA exportada desde ~ / .bashrc.

m43cap
fuente
2

Otra forma de lograr esto es simplemente decirle al shell que es un shell de inicio de sesión para que obtenga todos los archivos correctos. Hago esto para bash configurando explicit-bash-argsa ("--noediting" "--login"). Parece que el equivalente para zsh sería establecer explicit-zsh-argsen ("-l").

Entonces en mi .emacs:

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

En el tuyo, algo como:

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

Creo que no "--noediting"es necesario, y no parece haber una manera de decirle a zsh sobre esto, pero eso podría ser algo para investigar si esto no funciona tan bien como cabría esperar.

Ted Lemon
fuente
1
Esto funciona para un shell ejecutado bajo Emacs. No funciona para comandos que se ejecutan directamente dentro de Emacs, como a través de M-x shell-command.
Mernst
1

También puede establecer una ruta predeterminada para todo el sistema operativo X guardando, por ejemplo, una lista de propiedades como esta como ~/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>

La nueva ruta debe mostrarse en shells, Emacs y otras aplicaciones después de cerrar sesión y volver a iniciarla.

Este método no cambia la ruta en las aplicaciones que se abren como elementos de inicio de sesión o cuando las aplicaciones se vuelven a abrir al iniciar sesión después de un cierre forzado. Si tiene Emacs, una aplicación de terminal u otras aplicaciones donde desea cambiar la ruta en los elementos de inicio de sesión, deberá eliminarlos.

En 10.9 y anteriores también se puede añadir una línea como la siguiente /etc/launchd.conf:

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

Sin embargo, el soporte para /etc/launchd.conffue eliminado en 10.10.

nisetama
fuente