¿Cómo hacer que el terminal / shell generado dentro de Emacs que se ejecuta en una Mac herede las variables de entorno del terminal nativo?

7

El terminal de forma nativa en Mac, es decir, generado a través de Spotlight o Launchpad, adopta las variables de entorno deseadas, incluida la personalización ~/.bash_profile. Pero cuando corro Emacs ( Emacs.apptomado de Emacs para Mac OS X ) y la cáscara desove dentro de él (usando shell, eshello term), las conchas no se adoptan las mismas variables de entorno como se mencionó anteriormente.

Me doy cuenta de que el shell adopta su entorno del proceso que lo inicia y es por esto que los valores del entorno del shell varían de la misma manera que los de Emac (por ejemplo (getenv "PATH"))

Aventurándome dentro del contenido de Terminal.appy Emacs.appno tuve suerte.

¿Cómo puedo obtener automáticamente la misma variable de entorno que obtengo Terminal.appen el shell generado dentro de Emacs? Y no prefiero iniciar Emacs desde la terminal.

(Me doy cuenta de que esto es demasiado MacOSX-ish y las respuestas podrían proponer soluciones / ajustes que están totalmente fuera de Emacs. Pero la pregunta concierne a Emacs, por lo tanto, elegí este sitio)

Dedos sangrantes
fuente
Si inicia Emacs.app desde una ventana de Terminal, ¿ve las variables ambientales correctas?
Melioratus
De esa forma, las variables de entorno son más ricas pero no iguales a las del terminal desde el que se inició. Las personalizaciones (alias, etc.) en el ~ / .bash_profile no se leen. @Melioratus
Sangrado de los dedos
1
Extraño. Mi ~/.bash_profilese lee correctamente cuando ejecuto Emacs.appasí /Applications/Emacs.app/Contents/MacOS/Emacs . &usando Terminal.app.
Melioratus
Solo verifiqué que mis alias también funcionen.
Melioratus

Respuestas:

5

Recientemente comencé a usar emacs fuera del terminal, lo que me estaba causando algunos problemas de RUTA. Intenté configurarlo agregando (getenv "PATH")a mi ruta ejecutiva, entre otras cosas que finalmente nunca funcionaron.

Terminé instalando el paquete exec-path-from-shell a través de melpa. Funciona utilizando su $SHELLvariable de entorno para pedirle a su shell que imprima $PATHy copie el resultado.

Editar: Aquí está el código que uso

;; I set this at the beginning of my init.el for other mac specific settings
(defconst *is-a-mac* (eq system-type 'darwin))

;; Later on, after loading exec-path-from-shell package
(if *is-a-mac*
    (add-hook 'after-init-hook 'exec-path-from-shell-initialize))
Steven
fuente
1
Describa cómo esta respuesta responde a la pregunta. Por ejemplo, ¿de qué manera ayuda la instalación de ese paquete?
Dibujó
3

Dado el título real aquí "¿Cómo hacer que el terminal / shell generado dentro de Emacs que se ejecuta en una Mac herede las variables de entorno del terminal nativo?" no puede, ya que Emacs no tendrá Terminal.app como un súper proceso en ningún nivel, por lo que Emacs no puede heredar nada del shell en Terminal.app. Debe hacer que el entorno sea el mismo al obtener los mismos archivos.

Sobre la base de esta respuesta en AskDifferent

Debe tener en cuenta cuáles son los archivos de inicio para bash. ~ / .bash_profile se lee en un shell de inicio de sesión ~ / .bashrc cuando se inicia otro shell.

Cocoa Emacs es una GUI y cuando se ejecuta se ejecuta en un subproceso donde nada ha ejecutado un shell de inicio de sesión, por lo que en su entorno no hay nada que haya obtenido ~ / .bash_profile. Emacs iniciará un shell sin inicio de sesión, por lo que se leerá cualquier cosa en ~ / .bashrc.

Este tipo de cosas es la razón por la cual se recomienda en el manual de bash tener esto en ~ /, bash_profile

if [ -f ~/.bashrc ]; then . ~/.bashrc; fi 

y pon la configuración de tu entorno en ~ / .bashrc

En cuanto a por qué /Applications/Emacs.app/Contents/MacOS/Emacs. trabaja en la terminal. El valor predeterminado de Terminal.app es ejecutar un shell en modo de inicio de sesión, de modo que el shell ha obtenido ~ / .bash_profile y emacs es un subproceso de ese shell y, por lo tanto, hereda su entorno. Entonces, en este caso, usted hereda del shell en Terminal.app

Tenga en cuenta que X11 difiere a medida que lo ejecuta desde un shell para que el shell tenga variables de entorno ya que ese shell se inicia como un inicio de sesión.

usuario151019
fuente
3

Como dijo Mark, Terminal e iTerm 2 invocan shells como shells de inicio de sesión de forma predeterminada, para que Bash lea ~/.bash_profilepero no ~/.bashrc, M-x shelle M-x terminvoque shells como shells que no son de inicio de sesión, para que Bash lea ~/.bashrcpero no ~/.bash_profile. O bien añadir . ~/.bash_profilea ~/.bashrcy seguir usando ~/.bash_profilecomo archivo de configuración Bash, o añadir . ~/.bashrca ~/.bash_profiley comenzar a usar ~/.bashrccomo archivo de configuración Bash.

Para hacer shell-commandy shell-command-on-regionleer ~/.bash_profile, agregue -la shell-command-switch:

(setq shell-command-switch "-lc")

Puede establecer una ruta predeterminada amplia de OS X guardando, por ejemplo, una lista de propiedades como esta como ~/Library/LaunchAgents/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>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 las aplicaciones de terminal, 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 que 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.

nisetama
fuente