Obtendo o GNU Emacs Windows para executar meu ~ / .bash_profile ao criar um subprocesso de shell Cygwin M-x

1

Eu uso o GNU Emacs no Windows e o Cygwin para o shell em que faço todo o meu trabalho. O ~ / .profile usado pelo Cygwin é ~ / .bash_profile. Se eu iniciar um shell do Cygwin executando C: \ cygwin \ Cygwin.bat, ele será inicializado e executará ~ / .bash_profile fine.

Eu configurei o Cygwin no GNU Emacs no Windows colocando o seguinte em meus ~ / .emacs, como prescrito:

;; Set up Cygwin
(add-to-list 'load-path "C:/Program Files/emacs-site-lisp/cygwin")
(require 'setup-cygwin)

C: \ Arquivos de Programas \ emacs-site-lisp é onde eu coloco meu lisp em todo o site (obviamente).

Quando eu executo o shell M-x, um sub-processo bash do Cygwin é criado em um buffer chamado * shell *. Perfeito. No entanto, meu ~ / .bash_profile não é executado.

Como faço o efeito ~ / .bash_profile?

    
por alyssackwan 14.09.2010 / 17:10

2 respostas

4

A melhor resposta que posso dar é um link que explica as diferenças entre .bash_profile e .bashrc : link

Há muita história lá e parte disso tem a ver com o The Old Days, quando nós discaríamos em sistemas com modems lentos e queríamos um shell instalado e rodando rápido. Então, gostaríamos de "fazer login" com um ambiente que fosse rápido de configurar e, em seguida, gerar "sub-shells" que estavam totalmente configurados, porque era mais rápido fazer a partir de um shell já registrado.

No seu caso, seu shell inicial está sendo iniciado como um shell de login (verifique cygwin.bat - ele está chamando bash com --login ). Mas o sub-shell do emacs não está sendo iniciado como um shell de login. Portanto, apenas o seu arquivo .bashrc está sendo carregado.

Hoje em dia, acho que a maioria das pessoas mantém tudo no .bashrc e tem o .bash_profile carregado:

if [ -f ~/.bashrc ]; then
    source ~/.bashrc
fi

Mas você precisa ter cuidado para não anexar repetidamente variáveis como PATH se você adotar essa abordagem. Caso contrário, todos os sub-shell acabam com entradas duplicadas no PATH e você pode obter variáveis muito longas e incontroláveis que precisam ser pesquisadas e as coisas ficam mais lentas.

    
por 14.09.2010 / 17:34
2

É assim que eu faço e funciona:

(setq explicit-bash-args '("--login" "--init-file" "c:/home/cbalz/.bash_profile" "-i"))

Alguém poderia pensar que o 'bash.exe' executaria '.bash_profile' sem o arquivo init explícito, já que este é um shell de login ('--login') e 'bash.exe' localiza e executa corretamente '. bashrc '. Contudo, este não é o caso. Como '.bash_profile' fontes '.bashrc', a solução é apenas executar '.bash_profile'.

Acho que o Cygwin deve executar um serviço do Windows para gerenciar as variáveis de ambiente, para que os shells possam herdar corretamente.

    
por 17.09.2010 / 21:04