Я намагаюся отримати 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.