我正在尝试获取shell-command并async-shell-command与.bashrc文件中的几个程序无缝集成,在此示例中特别是direnv。
我发现,如果我进行了自定义shell-command-switch,则可以使外壳程序进程像常规的交互式登录外壳程序一样加载我的配置文件:
(setq shell-command-switch(纯副本“ -ic”)) (setqexplicit-bash-args'(“ -ic”“ export EMACS =; stty echo; bash”))
我也在使用exec-path-from-shell。
说我有一个~/.bashrc文件:
... 评估“ $(direnv hook $ 0)” 回声“ foo”
里面~/code/foo我有一个.envrc文件:
导出PATH = $ PWD / bin:$ PATH 回声“栏”
如果我运行M-x shell与default-directory设置为~/code/foo,是bash shell会正确加载我的个人资料和运行direnv钩到添加到我的路径:
direnv:加载.envrc 酒吧 direnv:导出〜PATH 〜/ code / foo $ echo $ PATH /用户/用户名/代码/ foo / bin:/ usr / local / bin:...#$ PATH的其余部分
但是如果default-directory仍然~/code/foo运行M-! echo $PATH,它将正确加载我的.bashrc,但不执行当前目录的direnv钩子:
富 / 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中的所有其他命令一起对其进行评估。