Running Bash scripts on Windows

Vegard Øye

How to run Bash scripts from Windows’ command prompt and extend it with common Unix commands.

The following setup allows one to run Bash scripts from Windows’ command prompt. It also augments it with common Unix commands like cp, rm and mv, which is useful if these are ingrained into muscle memory.

Note that this setup affects the command prompt (AKA cmd.exe). Although Windows 10 includes a full-fledged Ubuntu Linux Bash Shell, that shell – like PowerShell – is separate from the command prompt. Therefore, the following instructions still apply to Windows 10, as well as to earlier Windows versions. (For a brief list of standalone Bash shells for Windows, see the discussion at the end.)

Bash scripts (with an extension of .sh) are a Unix invention, and should not be confused with batch files (with an extension of .bat), which are a Windows invention. However, we could say that our goal is to help Windows run Bash scripts as if they were batch files.

Git for Windows

Install Git for Windows. When asked whether to install additional Unix utilities, choose Use Git and optional Unix tools from the Windows Command Prompt:

(The lighter Use Git from the Windows Command Prompt option can also be chosen, but then one must install MSYS manually.)

We can now open a command prompt window and run a Bash script as follows:

sh script.sh

If the script accepts parameters, we just provide them at the end:

sh script.sh --param1 val1 --param2 val2

Git for Windows also extends the command prompt with common Unix commands like cp, rm and mv:

cp script.sh script2.sh
rm script.sh
mv script2.sh script.sh

Git Bash, a standalone shell, is installed as well. It can be run as a separate program, or in the command prompt. To do the latter, just type bash; to return to the standard command prompt, type exit. A .bash_profile file can be used to store settings between sessions. To edit this file, start Git Bash and type:

notepad ~/.bash_profile

(Feel free to substitute vi for notepad if familiar with the former.) Below is an example file that configures the history size:

HISTSIZE=10000
HISTFILESIZE=10000

Configuring Bash settings is not covered here – that is a topic in its own right. Note that Git Bash typically stores the .bash_profile file at C:\Users\user\.bash_profile.

Update PATHEXT

With further refinements, we can trim the initial “sh” from the script invocation in the command prompt. First, associate .sh files with sh.exe. To do this, create a blank script.sh file (with Notepad, for example) and right-click on it. Choose Open with from the context menu. Click More apps and navigate to C:\Program Files\Git\bin\sh.exe. Enable Always use this app to open .sh files and click OK.

Next, update the value of the PATHEXT environmental variable. To access the variable, go to Control PanelSystemAdvancedEnvironment Variables. The value is a list of file extensions separated by ;, for example:

.COM;.EXE;.BAT;.CMD;.VBS;.VBE;.JS;.JSE;.WSF;.WSH;.MSC

Add ;.SH to the end:

.COM;.EXE;.BAT;.CMD;.VBS;.VBE;.JS;.JSE;.WSF;.WSH;.MSC;.SH

We can now run .sh files directly from the command prompt, like so:

script.sh --param1 val1 --param2 val2

We can also run a .sh file by clicking on it. However, note that the .sh extension is required to identify the file as a Bash script. Windows does not parse the #!/bin/sh shebang line; to execute an extensionless script, use sh (e.g., sh script).

GnuWin32

For even more Unix utilities, install GnuWin32. Ensure that its utilities are globally available by appending the location of GnuWin32’s executables (its bin/ directory) to the PATH environment variable. The value is a list of file paths separated by ;, for example:

%SystemRoot%\system32;%SystemRoot%;C:\Ruby22\bin

Thus, if GnuWin32’s executables are located in C:\GnuWin32\bin, simply add ;C:\GnuWin32\bin to the end:

%SystemRoot%\system32;%SystemRoot%;C:\Ruby22\bin;C:\GnuWin32\bin

On Windows 10, the variable may be displayed as an editable list of directories. Add the directory to the bottom of the list.

We now have a host of tools at our command. For example, make builds a software project from a Makefile, while wget downloads a file from the Internet. Peruse GnuWin32’s package list to get a sense of the possibilities.

MinGW

For additional developer tools, augment the above setup with a complete installation of MinGW. Append its directory to PATH after the other directories.

We can now link (ld) and compile C programs (gcc) and C++ programs (g++).

Alias open

Windows does not have the open command, and none of the packages above provide it. To alias open to Windows’ start command, navigate to MSYSbin/ directory (C:\Program Files\Git\usr\bin or C:\msys\1.0\bin) and create an open.bat file containing the following:

@echo off
start %*

For Git Bash, we need to add a Bash alias to .bash_profile. Start Git Bash and type:

notepad ~/.bash_profile

Then add the following line:

alias open='start'

Alias find

Windows’ own find utility shadows the Unix find command. To create an alias for the latter, make a copy of find.exe, find2.exe, in the same folder (typically C:\Program Files\Git\usr\bin). The Unix command can now be accessed as find2.

Alternatively, switch to Git Bash for the duration of the command:

bash
find . -name "*.txt"
exit

Alternatives

MSYS

The above instructions assume that MSYS is installed along with Git for Windows. However, it is also possible to install MSYS manually. If this applies, then run the MSYS installer and append MSYSbin/ directory to PATH after the other directories.

Standalone shells

Windows 10 includes its own Linux Bash Shell, based on Ubuntu. Note that this is a standalone shell, similar to PowerShell; Windows 10’s command prompt is unaffected and will still benefit from the instructions above. However, a standalone shell may provide built-in functionality that cannot be added to the command prompt (searchable history, for example).

Also note that if we install the Linux Bash Shell, then the bash command switches to that shell, not to Git Bash. However, we can still use the git bash command to change to Git Bash from the command prompt.

Another comprehensive standalone shell is provided by the Cygwin project, which can be used on older Windows versions. MSYS and MinGW also provide standalone shells. Git Bash, the shell provided by Git for Windows, is in fact an extension of these.