Я пытаюсь получить shell-command
и async-shell-command
легко интегрировать с парой программ в моем .bashrc
файле, в частности, direnv в этом примере.
Я обнаружил, что если бы я настроил shell-command-switch
, я мог заставить процессы оболочки загружать мой профиль, как если бы это была обычная интерактивная оболочка входа в систему:
(setq shell-command-switch (purecopy "-ic")) (setqlicit-bash-args '("-ic" "export EMACS =; stty echo; bash"))
Я также использую exec-path-from-shell .
Скажем, у меня есть ~/.bashrc
файл с:
... eval "$ (direnv hook $ 0)" эхо "фу"
Внутри у ~/code/foo
меня есть .envrc
файл с:
экспорт PATH = $ PWD / bin: $ PATH эхо "бар"
Если я запускаю M-x shell
с default-directory
установленным на ~/code/foo
, оболочка bash правильно загрузит мой профиль и запустит ловушку direnv, чтобы добавить это к моему пути:
direnv: загрузка .envrc бар direnv: экспорт ~ PATH ~ / code / foo $ echo $ PATH / Users / имя пользователя / код / foo / bin: / usr / local / bin: ... # остаток $ PATH
Однако, если default-directory
все еще, ~/code/foo
и я запускаю M-! echo $PATH
, он корректно загружает мой .bashrc, но не выполняет ловушку direnv текущего каталога:
Foo / usr / local / bin: ... # остаток $ PATH без ./bin
Я получаю тот же результат, если я бегу M-! cd ~/code/foo && echo $PATH
.
Есть ли способ, которым я могу посоветовать или подключиться shell-command
или start-process
заставить его вести себя так, как будто он отправляется из интерактивного буфера оболочки?
eval "$(direnv hook $0)"
. Это выполняется, но механизм, который должен срабатывать, когда вы находитесь в определенном каталоге с .envrc
файлом, не работает.
.envrc
файле не оценивается? Или это просто переменные среды, которые не экспортируются? Не могли бы вы привести полный пример, чтобы я мог попытаться воспроизвести это?
(setq shell-command-switch "-ic")
то он должен оцениваться вместе с любой другой командой в ~ / .bashrc.