I was looking for was a no-fuss, lightweight, robust and as simple as possible solution to running my normal Bash-based workflow inside the main Windows filesystem, interacting with the Windows world. Turns out there are some solutions. Read on for more info on that.
Windows Subsystem for Linux too heavy
First, I must mention the impressive work by Microsoft on the Windows Subsystem for Linux (aka. WSL), which more or less lets you run an almost full-blown distribution of popular Linux distros like Ubuntu and Fedora. WSL is awesome, but also kind of heavy, easily taking something closer to an hour to install. It also has some odd behaviours like opening files in Windows from WSL will give you troubles with line endings (as you might know Windows uses
\r\n for line endings while Linux uses just
\n). Finally, the default bash terminal for WSL did not even have zoomable text. All in all, this made it clear that this is not the light-weight simple solution I was looking for. WSL is awesome, but too heavy that I will be comfortable to quickly install it on any Windows machine I need to spend time working on.
Enter Git-Bash and MSYS2
Thus, I continued my search. I found Git-Bash, which is part of the Git package for Windows. It provides a simple bash environment with git pre-installed and configured, and works extremely well for simple tasks.
The main drawback I found with Git-Bash was that it does not contain or allow an easy route to install my favorite terminal multiplexer / window manager: tmux. One nice blog post mentioned the system that Git-Bash builds upon, and that it sports a package manager which can install a lot more software: MSYS2. Long story short: I tried MSYS2, and now I'm (figuratively) in love. With a few (fixable) caveats I now can run pretty much my full command-line bash+tmux+vim+git(+etc etc) workflow from Xubuntu, IN WINDOWS, right inside the Windows filesystem ... and things just work!
So, for my own and others' documentation, I below provide documentation of the procedure I have so far followed to enable a comfortable very Linux-like bash environment in Windows.
How to set up a nice environment based on MSYS2
- Install MSYS2 by following the instructions here.
- Start MSYS2 from the start menu in Windows.
- Run upgrades of packages with the pacman packager:
- Hard restart terminal
- Install packages with
pacman -S <package>
- Some packages I installed:
- tig (The awesome text-mode interface to git)
- man-db (for manual pages)
- Some packages I installed:
- Install the python 3.7 Windows package from python.org
- Configure git to check out files with Windows style line endings, but check in with Linux style ditto:
git config --global core.autocrlf true
- Make python scripts properly print output continuously:
alias python='winpty python.exe'
- For Python development,
- Install the Chocolatey package manager, for installing many open source programs via the commandline, by following these instructions.
- If you run Windows in VirtualBox, make sure to enable bidirectional clipboard in VirtualBox, by right clicking on the virtual machine and choosing:
"Settings > General > Advanced" and setting "Shared clipboard" to "bidirectional".
If you follow the above instructions roughly, you might end up with an environment like this:
So far, I'm super pleased with this setup.
I noticed the following caveats:
- For pasting in terminals in Windows:You use Shift + Insert instead of the normal Ctrl + Shift + V from Linux.
- At least for Git-Bash, you need to name you ssh-keys
~/.ssh/id_rsa, not some custom name like
~/.ssh/.id_rsa_gitlab, or it won't be picked up (haven't tried with MSYS2 yet). There should be a way to change this, but I haven't had the time to check it up just yet.
- Some commands, such as
dotnet, the commandline tool for .Net core, are not cancelleable via Ctrl + C unless you run them via
winpty. So, you'd run:
- Running commands via winpty on the other hand means that you can't pipe or redirect the outputs like normal linux commands. To solve that, run
- For dotnet, I created an alias definition
alias dn='winpty -Xallow-non-tty dotnet'which I put in my