J'essaie d'obtenir shell-command
et async-shell-command
d'intégrer de manière transparente avec quelques programmes dans mon .bashrc
fichier, en particulier direnv dans cet exemple.
J'ai trouvé que si je personnalisais shell-command-switch
, je pouvais obtenir des processus shell pour charger mon profil comme s'il s'agissait d'un shell de connexion interactif normal:
(setq shell-command-switch (purecopy "-ic")) (setq explicit-bash-args '("-ic" "export EMACS =; stty echo; bash"))
J'utilise également exec-path-from-shell .
Disons que j'ai un ~/.bashrc
fichier avec:
... eval "$ (crochet direnv $ 0)" écho "foo"
A l'intérieur ~/code/foo
j'ai un .envrc
dossier avec:
export PATH = $ PWD / bin: $ PATH écho "bar"
Si je lance M-x shell
avec default-directory
set to ~/code/foo
, un shell bash chargera correctement mon profil et exécutera le hook direnv pour l'ajouter à mon chemin:
direnv: chargement .envrc bar direnv: export ~ PATH ~ / code / foo $ echo $ PATH / Utilisateurs / nom d'utilisateur / code / foo / bin: / usr / local / bin: ... # reste de $ PATH
Cependant si default-directory
est toujours ~/code/foo
et que je cours M-! echo $PATH
, il charge correctement mon .bashrc mais n'exécute pas le hook direnv du répertoire courant:
foo / usr / local / bin: ... # reste de $ PATH sans ./bin
J'obtiens le même résultat si je cours M-! cd ~/code/foo && echo $PATH
.
Existe-t-il un moyen de conseiller ou de connecter shell-command
ou start-process
de le faire se comporter comme s'il était envoyé à partir d'un tampon shell interactif?
eval "$(direnv hook $0)"
. Cela s'exécute, mais le mécanisme qui devrait être déclenché lorsque vous êtes dans un répertoire spécifique avec un .envrc
fichier ne l'est pas.
.envrc
fichier n'est-il évalué? Ou s'agit-il uniquement de variables d'environnement qui ne sont pas exportées? Pourriez-vous s'il vous plaît fournir un exemple complet afin que je puisse essayer de le reproduire?
(setq shell-command-switch "-ic")
il doit être évalué avec toutes les autres commandes dans ~ / .bashrc.