A shell is a layer or interface between you and an operating system. There are a lot of command-line shells for Windows, including:
Over the years, I’ve used all six of the above Windows shells. I recently installed Git for Windows and now I can add a seventh shell to the list of Windows shells that I’ve used:
Bash is a an acronym for “Bourne again shell” and it is a command-line shell that was created for Unix-like systems. Details are at wikipedia.org/wiki/Bash_(Unix_shell).
|Git Bash is useful even if you do not use git.|
I like Git Bash because…
I’m more comfortable with bash commands than CMD or PowerShell commands (because I’ve been using Bourne shell (sh) and friends for more than 30 years).
It’s easy to install.
It has a small footprint.
It installs a
Git Bash Here command that is available when right-clicking on a folder in Windows File Explorer.
I can pipe the output of commands through the
which is better than the
In addition to
many other bash commands
are available including
I can view
built-in help for a bash command with, for example,
I can write bash or sh scripts and…
my Windows environment variables are available,
and I do not have to worry about WSL file system issues because Git Bash uses the regular Windows file system (but be aware that Git Bash uses forward-slash-delimited paths to refer to the Windows file system).
I can use redirection (with, for example,
>) to create a file
UTF-8 Unicode text rather than
Little-endian UTF-16 Unicode text, with CRLF line terminators
(which is the CMD and PowerShell default encoding🙀).
It has helpful discussion groups, for example github.com/git-for-windows/git/discussions, stackoverflow.com/questions/tagged/git-bash, stackoverflow.com/questions/tagged/git-for-windows, and superuser.com/questions/tagged/git-bash.
To install Git Bash, install Git For Windows, which you can download from either…
Think carefully about what options you choose during the installation.
If you are a power user, the defaults are probably not what you want.
I changed the default install directory,
because this helps me remember the full name of the app in
|Git For Windows requires Windows Vista or later. Windows Vista was released in 2007 (~14 years ago).|
To see what version of Git for Windows you are using, run the following at a Git Bash prompt:
To update Git for Windows, run the following at a Git Bash prompt:
When you update Git for Windows…
To launch Git Bash…
double click the Git Bash shortcut that’s on your Desktop,
or right-click on a folder in Windows File Explorer and choose
Git Bash Here,
Code Terminal (this will
if you have followed
the Git Bash instructions at
$TERM is something like
xterm (discussed in the next section).)
If you right-click on the default Desktop Git Bash shortcut and choose Properties, you will see something like the following.
Target: "C:\Program Files\Git\git-bash.exe"
--cd-to-homeStart in: %HOMEDRIVE%%HOMEPATH%
You can change these shortcut properties if you like.
~/.bash_profile exists, the commands in it
are run each time you start a Git Bash session.
To create and edit this file do the following.
Launch Git Bash.
At the Git Bash command-line prompt, run one of these commands:
nano ~/.bash_profile vim ~/.bash_profile
Note that the
TUI (terminal user interface)
vim are included in Git Bash and are on your PATH.
(If you do not know how to use
vim, I recommend that you use
nano because, otherwise, it
may take you a while to figure out how to exit vim.😆)
Add whatever commands you’d like to this file. Here is an
excerpt of my
## Created: 2021-02-28 ## use `gvim filename` to edit filename with GUI Vim alias gvim="/C/Windows/gvim.bat" ## use `cdi` to cd to the Infinite Ink project root ## note I set INFINITEINKROOT environment variable via Control Panel alias cdi="cd `cygpath $INFINITEINKROOT`" ## make Backspace key and other things work in VS Code's Terminal emulator export TERM=xterm
Save your edits and close the editor.
At the Git Bash prompt, use the folowing
file command to check the file type.
will probably display
“CRLF line terminators”
are mentioned in
you can convert it to Unix-format with the following command.
nano --unix ~/.bash_profile
To learn about this and other
nano command-line arguments, see the
nano man page or run the following.
|After you change your
To see what aliases are available, run:
On my system, this displays:
alias gvim='/C/Windows/gvim.bat' alias cdi='cd /c/Users/USERNAME/path/to/infiniteink/project/root' alias ll='ls -l' alias ls='ls -F --color=auto --show-control-chars'
The first two aliases are the ones I created above in my
The last two are Git Bash’s default aliases.
|Default aliases (and more) are specified in files that are located in the |
The default Git Bash terminal emulator is
solarized color scheme
so I edited
so it includes the following.
ForegroundColour=101,123,131 BackgroundColour=253,246,227 CursorColour=220,50,47 Black=7,54,66 BoldBlack=0,43,54 Red=220,50,47 BoldRed=203,75,22 Green=133,153,0 BoldGreen=88,110,117 Yellow=181,137,0 BoldYellow=101,123,131 Blue=38,139,210 BoldBlue=131,148,150 Magenta=211,54,130 BoldMagenta=108,113,196 Cyan=42,161,152 BoldCyan=147,161,161 White=238,232,213 BoldWhite=253,246,227
To change the character set and fonts used in the mintty terminal emulator, right click anywhere in a mintty window or title bar, choose Options, choose Text in the left pane, and then…
DejaVu Sans Mono, 10pt
(or whatever you prefer) for the font.
Under Character Set, choose UTF-8 (or whatever you prefer).
These and other settings will be appended to the bottom of your
Normally Unix-like shells are case sensitive, but Git Bash, in general, is case insensitive.
To view your current path, run the following command, which means “print working directory.”
To go to your Git Bash home directory,
which is also known as
run either of the following equivalent commands.
cd cd ~
On most systems, your Git Bash home directory is…
USERNAME replaced with your user name.
Note that in Git Bash…
The path delimiter is slash (
/), which is also known as forward slash.
C:\ is mounted as
To list all mounts, run the
You can display the Windows-style path of the current working directory with
When you are at a Git Bash prompt, you can launch
a file or directory in your system’s default app
which is equivalent
start command (thanks to case insensitivity).
For example, to open the current directory in Windows File
Explorer, use this:
start . 👆 Notice this dot (.)
To open an HTML file in your default web browser, use something like this:
To find out the environment variables available to Git Bash, run:
This includes the PATH environment variable, which lists the directories that are searched for executables.
I’d rather write a bash or sh shell script than a Windows batch file to deal with apps, files, and folders that live in my Windows file system. Thanks to Git Bash, It’s easy to do this. (I have learned the hard way that it’s not so easy to do this in WSL.)
When you run
printenv, you can see that the
on your PATH. This is a reasonable place to put your Git Bash scripts.
To create this directory, run this command:
One of my scripts is called
and it looks like this:
#!/bin/sh ## Created: 2021-02-28 ## Filename: gvim-winpath ## Usage: gvim-winpath "C:\path\to\filename" /c/windows/gvim.bat `cygpath "$1"`
I use this to launch gvim on a file that
is specified using a Windows-style backslash path.
To learn about the
cygpath command, which is used in this script, run
the following commands at a Git Bash prompt.
cygpath --help cygpath --help |less
If you pipe the
output to the
less pager, you
need to know
The essentials are
less, you can
press Space to page down,
press b (for back) to page up,
In most Unix-like shells, you need to
chmod +x executables
but in Git Bash this is not needed.
Arguments to nix-nux commands, in general, are case sensitive. For example, in the following
cygpath is case insensitive and its argument
--help is case sensitive.
but this does not work:
To quit Git Bash, you can either click the close-window X in the upper right corner of the terminal window or type the following at the command prompt:
must be all lower case
does not show up when you run
morecommand is not included in Git Bash, but the
lesscommand, which can do everything
morecan do (and more), is.
&to the end of the command so it will be launched as a background job.
bashis “Bourne again shell” and
shis “Bourne shell”.