Estoy tratando de conseguir shell-command
y async-shell-command
para integrarse perfectamente con un par de programas en mi .bashrc
archivo, específicamente direnv en este ejemplo.
Descubrí que si lo personalizaba shell-command-switch
, podía obtener procesos de shell para cargar mi perfil como si fuera un shell de inicio de sesión interactivo normal:
(setq shell-command-switch (purecopy "-ic")) (setq explicit-bash-args '("-ic" "export EMACS =; stty echo; bash"))
También estoy usando exec-path-from-shell .
Digamos que tengo un ~/.bashrc
archivo con:
... eval "$ (enlace directo $ 0)" echo "foo"
Dentro ~/code/foo
tengo un .envrc
archivo con:
RUTA de exportación = $ PWD / bin: $ RUTA echo "bar"
Si ejecuto M-x shell
con default-directory
set to ~/code/foo
, un shell bash cargará correctamente mi perfil y ejecutará el enlace directo para agregarlo a mi ruta:
direnv: cargando .envrc bar direnv: export ~ RUTA ~ / code / foo $ echo $ PATH / Usuarios / nombre de usuario / código / foo / bin: / usr / local / bin: ... # resto de $ PATH
Sin embargo, si default-directory
está quieto ~/code/foo
y ejecuto M-! echo $PATH
, carga correctamente mi .bashrc pero no ejecuta el enlace direnv del directorio actual:
foo / usr / local / bin: ... # resto de $ PATH sin ./bin
Obtengo el mismo resultado si corro M-! cd ~/code/foo && echo $PATH
.
¿Hay alguna manera de aconsejar o conectar shell-command
o start-process
hacer que se comporte como si se enviara desde un búfer de shell interactivo?
eval "$(direnv hook $0)"
. Esto se está ejecutando, pero el mecanismo que debería activarse cuando está en un directorio específico con un .envrc
archivo no lo está.
.envrc
evalúa nada en el archivo? ¿O son solo las variables de entorno que no se exportan? ¿Podría darme un ejemplo completo para que pueda intentar reproducir esto?
(setq shell-command-switch "-ic")
entonces debe evaluarse junto con cualquier otro comando en ~ / .bashrc.