Ich versuche , zu erhalten shell-command
und async-shell-command
mit ein paar Programme in meiner nahtlos zu integrieren .bashrc
Datei, speziell direnv in diesem Beispiel.
Ich stellte fest, dass ich beim Anpassen shell-command-switch
Shell-Prozesse dazu bringen könnte, mein Profil so zu laden, als wäre es eine reguläre interaktive Login-Shell:
(setq shell-command-switch (purecopy "-ic")) (setq explizit-bash-args '("-ic" "export EMACS =; stty echo; bash"))
Ich benutze auch exec-path-from-shell .
Angenommen, ich habe eine ~/.bashrc
Datei mit:
... eval "$ (direnv hook $ 0)" Echo "foo"
Im Inneren habe ~/code/foo
ich eine .envrc
Datei mit:
export PATH = $ PWD / bin: $ PATH Echo "Bar"
Wenn ich M-x shell
mit default-directory
set to ~/code/foo
ausführe, lädt eine Bash-Shell mein Profil korrekt und führt den direnv-Hook aus, um dies meinem Pfad hinzuzufügen:
direnv: Laden von .envrc Bar direnv: export ~ PATH ~ / code / foo $ echo $ PATH / Benutzer / Benutzername / Code / foo / bin: / usr / local / bin: ... # Rest von $ PATH
Wenn dies default-directory
jedoch immer noch der Fall ist ~/code/foo
und ich ausgeführt werde M-! echo $PATH
, wird meine .bashrc-Datei korrekt geladen, der direnv-Hook des aktuellen Verzeichnisses wird jedoch nicht ausgeführt:
foo / usr / local / bin: ... # Rest von $ PATH ohne ./bin
Ich bekomme das gleiche Ergebnis, wenn ich renne M-! cd ~/code/foo && echo $PATH
.
Gibt es eine Weise , die ich beraten oder Haken in shell-command
oder start-process
um es sich verhalten , als ob es aus einem interaktiven Shell - Puffer gesendet wurden?
eval "$(direnv hook $0)"
. Dies wird ausgeführt, aber der Mechanismus, der ausgelöst werden soll, wenn Sie sich in einem bestimmten Verzeichnis mit einer .envrc
Datei befinden, ist dies nicht.
.envrc
Datei ausgewertet? Oder werden nur Umgebungsvariablen nicht exportiert? Könnten Sie bitte ein vollständiges Beispiel angeben, damit ich versuchen kann, dies zu reproduzieren?
(setq shell-command-switch "-ic")
es ausgewertet haben, sollte es zusammen mit jedem anderen Befehl in ~ / .bashrc ausgewertet werden.