Before we get started, it will be expected that you’re running WSL 2. You can
verify that by running wsl.exe --version
from a terminal. If you get a
command not found error then you’re running WSL 1 and should switch to WSL 2.
Here’s the results in my case. At the time of writing this post I’m using the
latest stable release of WSL 2. You can find the current latest version on
GitHub, if you want to update to
the latest version you can run wsl.exe --update
.
$ wsl.exe --version
WSL version: 2.3.24.0
Kernel version: 5.15.153.1-2
WSLg version: 1.0.65
MSRDC version: 1.2.5620
Direct3D version: 1.611.1-81528511
DXCore version: 10.0.26100.1-240331-1435.ge-release
Windows version: 10.0.19045.5011
Also, it will be expected that you haven’t disabled opening Windows programs
from within WSL 2 or prevented your $PATH
from being modified with Windows
paths. By default everything will work without any custom configuration
unless you went to your /etc/wsl.conf
file and set both of these options to
false
:
[interop]
# Setting this key will determine whether WSL will support launching Windows processes.
enabled = true
# Setting this key will determine whether WSL will add Windows path elements to the $PATH env var.
appendWindowsPath = true
The above options are set to true
by default based on Microsoft’s
documentation so you
don’t need to set them. I included them here in case you happened to set them
to false
in which case you’ll want to remove them so they default to true
.
# Launching Windows Programs
Funny enough we already did when we checked the WSL 2 version but let’s say you want to do something else like open a WSL 2 directory with Windows explorer.
All you have to do is cd
into the directory you want and run explorer.exe .
which opens the current working directory. You can also tab complete these
tools like any other WSL 2 CLI tool, for example if you type expl
and hit TAB
it should complete it.
Some programs work out of the box because if you run echo $PATH
you’ll likely
see a bunch of Windows paths mixed in with WSL 2 paths. In my case, here’s 2
that stand out:
/c/WINDOWS/system32
/c/WINDOWS
The explorer.exe
binary is in your Windows directory and your system32
directory has tons of Windows tools, such as calc.exe
.
What Happens When a Program Isn’t on Your Path?
If you tried to launch chrome.exe
chances are it won’t work (command not
found), that’s because it’s not on your WSL 2 system path.
If you installed Chrome in its default location you should be able to run
/c/Program\ Files\ \(x86\)/Google/Chrome/Application/chrome.exe
to launch
chrome. If not then replace /c
with /mnt/c
because I customized my mount
location in /etc/wsl.conf
with root = /
.
That’s cool, but it would be annoying to type that every time so you could make
a shell alias just for Chrome such as alias chrome="/c/Program\ Files\ \(x86\)/Google/Chrome/Application/chrome.exe"
and then you can run chrome
directly.
Still, we can do better because it would be tedious to make a custom alias for each non-Windows app you want to launch in a convenient way.
Inherit What’s on Your Windows Path Inside of WSL 2
You can run cmd.exe /C start <app>
where <app>
is a tool you want to run
such as cmd.exe /C start chrome
or in my case I’m a big fan of
foobar2000 for listening to mp3s so I can run
cmd.exe /C start foobar2000
since it’s on my Windows path.
The /C
is unrelated to your C:\
drive, it’s a cmd.exe
option which says
to run a command and then terminate cmd.exe
itself.
You probably noticed in your terminal that the cmd.exe
tool throws a warning:
$ cmd.exe /C start chrome
'\\wsl.localhost\Ubuntu\home\nick'
CMD.EXE was started with the above path as the current directory.
UNC paths are not supported. Defaulting to Windows directory.
We can silence that by running cmd.exe /C start chrome 2> /dev/null
and since
we’re spawning a Windows app, if you try to run a command that doesn’t exist
then Windows will throw an error dialog so we can at least still see invalid
commands.
Armed with all of the above knowledge, we can make this easy to use with a
shell alias with alias wopen="cmd.exe /C start 2> /dev/null"
and now you can
run wopen chrome
or whatever you want, including wopen explorer .
instead
of explorer.exe .
if you wanted to.
This alias has been added to my dotfiles.
The video below demos running a few of these commands.
# Demo Video
Timestamps
- 0:22 – Make sure you’re using WSL 2
- 0:56 – Avoid disabling this in your WSL config
- 1:52 – Your mount path might be different
- 2:29 – Opening directories with Windows explorer
- 3:23 – Looking at your WSL 2 PATH
- 4:43 – Running non-Windows programs
- 5:59 – Using cmd.exe to launch Windows apps
- 6:54 – Putting the final solution into an alias
- 7:38 – What about custom installed tools?
Which Windows programs do you typically launch from WSL 2? Let me know below.