Я намагаюся отримати shell-commandта async-shell-commandінтегруватись безперечно з парою програм у моєму .bashrcфайлі, зокрема direnv у цьому прикладі.
Я виявив, що якщо я налаштував shell-command-switch, я можу отримати процеси оболонки, щоб завантажити мій профіль, як якщо б це була звичайна інтерактивна оболонка входу:
(setq shell-command-switch (чистокопія "-ic"))
(setq явно-bash-args '("-ic" "експорт EMACS =; stty echo; bash"))
Я також використовую exec-path-from-shell .
Скажіть, у мене є ~/.bashrcфайл із:
... eval "$ (гачок direnv $ 0)" відлуння "foo"
Всередині у ~/code/fooмене є .envrcфайл із:
експорт PATH = $ PWD / бін: $ PATH відлуння "бар"
Якщо я запускаю M-x shellз default-directoryвстановленим на ~/code/foo, оболонка bash правильно завантажить мій профіль і запустить гачок direnv, щоб додати це до мого шляху:
direnv: завантаження .envrc бар direnv: експорт ~ ПАТ ~ / code / foo $ echo $ PATH / Користувачі / ім'я користувача / код / 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.