How can I run Cygwin Bash Shell from within Emacs? How can I run Cygwin Bash Shell from within Emacs? windows windows

How can I run Cygwin Bash Shell from within Emacs?


shell-file-name is the variable that controls which shell Emacs uses when it wants to run a shell command.

explicit-shell-file-name is the variable that controls which shell M-x shell starts up.

Ken's answer changes both of those, which you may or may not want.

You can also have a function that starts a different shell by temporarily changing explicit-shell-file-name:

(defun cygwin-shell ()  "Run cygwin bash in shell mode."  (interactive)  (let ((explicit-shell-file-name "C:/cygwin/bin/bash"))    (call-interactively 'shell)))

You will probably also want to pass the --login argument to bash, because you're starting a new Cygwin session. You can do that by setting explicit-bash-args. (Note that M-x shell uses explicit-PROGRAM-args, where PROGRAM is the filename part of the shell's pathname. This is why you should not include the .exe when setting the shell.


The best solution I've found to this is the following:

;; When running in Windows, we want to use an alternate shell so we;; can be more unixy.(setq shell-file-name "C:/MinGW/msys/1.0/bin/bash")(setq explicit-shell-file-name shell-file-name)(setenv "PATH"    (concat ".:/usr/local/bin:/mingw/bin:/bin:"        (replace-regexp-in-string " " "\\\\ "            (replace-regexp-in-string "\\\\" "/"                (replace-regexp-in-string "\\([A-Za-z]\\):" "/\\1"                    (getenv "PATH"))))))

The problem with passing "--login" as cjm suggests is your shell will always start in your home directory. But if you're editing a file and you hit "M-x shell", you want your shell in that file's directory. Furthermore, I've tested this setup with "M-x grep" and "M-x compile". I'm suspicious that other examples here wouldn't work with those due to directory and PATH problems.

This elisp snippet belongs in your ~/.emacs file. If you want to use Cygwin instead of MinGW, change the first string to C:/cygwin/bin/bash. The second string is prepended to your Windows PATH (after converting that PATH to an appropriately unixy form); in Cygwin you probably want "~/bin:/usr/local/bin:/usr/bin:" or something similar.


I use XEmacs with Cygwin, and can run bash from XEmacs relatively easily.

Here's the relevant section from init.el

;; Let's use CYGWIN bash...;;(setq binary-process-input t) (setq w32-quote-process-args ?\") (setq shell-file-name "bash") ;; or sh if you rename your bash executable to sh. (setenv "SHELL" shell-file-name) (setq explicit-shell-file-name shell-file-name) (setq explicit-sh-args '("-login" "-i"))