I often work in a sort of amphibious environment, using Unix software on Windows. As you can well imagine, this causes headaches. But I’ve found such headaches are generally more manageable than the headaches from alternatives I’ve tried.
On the Windows command line, you can type the name of a file and Windows will open the file with the default application associated with its file extension. For example, typing
foo.docx and pressing Enter will open the file by that name using Microsoft Word, assuming that is your default application for
Unix shells don’t work that way. The first thing you type at the command prompt must be a command, and
foo.docx is not a command. The Windows command line generally works this way too, but it makes an exception for files with recognized extensions; the command is inferred from the extension and the file name is an argument to that command.
When you’re running bash on Windows, via WSL (Windows Subsystem for Linux), you can run the Windows utility
start which will open a file according to its extension. For example,
cmd.exe /C start foo.pdf
will open the file
foo.pdf with your default PDF viewer.
You can also use
start to launch applications without opening a particular file. For example, you could launch Word from bash with
cmd.exe /C start winword.exe
Eshell is a shell written in Emacs Lisp. If you’re running Windows and you do not have access to WSL but you do have Emacs, you can run eshell inside Emacs for a Unix-like environment.
If you try running
that will probably not work because eshell does not use the windows PATH environment.
I got around this by creating a Windows batch file named
mystart.bat and put it in my path. The batch file simply calls
start with its argument:
Now I can open
foo.pdf from eshell with
The solution above for bash
cmd.exe /C start foo.pdf
also works from eshell.
(I just realized I said two contradictory things: that eshell does not use your path, and that it found a bash file in my path. I don’t know why the latter works. I keep my batch files in
c:/bin, which is a Unix-like location, and maybe eshell looks there, not because it’s in my Windows path, but because it’s in what it would expect to be my path based on Unix conventions. I’ve searched the eshell documentation, and I don’t see how to tell what it uses for a path.)
4 thoughts on “Opening Windows files from bash and eshell”
I haven’t used eshell on Windows before, but as I recall, eshell uses the eshell-path-env variable, which is initialized to (getenv “PATH”); perhaps an interaction between how getenv works under windows & how Emacs is being launched?
Cygwin, which has plenty of down sides, does have the very nice ‘cygstart’ command, which describes itself as “Let Windows start a program or open a file or URL.”
Yes, you can associate type and/or extension with particular application, and it is a shell-independent way, called binfmt_misc
On linux xdg-open will open any document in the default program for the MIME type. I find it useful to give it a short alias.