Skip to content
/ BashWin Public

An attempt at allowing bash scripts to run on a Windows box

Notifications You must be signed in to change notification settings

skanga/BashWin

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

11 Commits
 
 
 
 

Repository files navigation

Table of Contents

Bash for Windows

The fastest way to get your bash scripts running on Windows

What is it?

This project allows you to run bash scripts on Windows OSes without using Cygwin (http://www.cygwin.com/), MinGW/MSYS (http://www.mingw.org/wiki/MSYS) or any other large Unix emulation layer (https://github.com/bmatzelle/gow/wiki). It uses a tiny executable (636K) called busybox.exe instead in order to accomplish this task. BusyBox is known as "The Swiss Army Knife of Embedded Linux".

How do I use it?

This is best explained using an example:

Lets say I have a simple script called bacftp.sh that I use to FTP my zipped backup file to a remote server. It looks like this:

#!/bin/sh
HOST='big-box.backup.com'
USER='my-username'
PASSWD='my-password'
FILE='my-compressed-backup.zip'

ftp -n $HOST <<END_SCRIPT
quote USER $USER
quote PASS $PASSWD
hash
bin
put $FILE
quit
END_SCRIPT
exit 0

Normally this cannot run on Windows systems.

In order to get it to work with BashWin you need to get two files.

1) Download busybox.exe from https://frippery.org/files/busybox/busybox.exe and place it anywhere in your PATH

wget https://frippery.org/files/busybox/busybox.exe
ren busybox.exe c:\bin

2) Download runbash.bat from this repository at https://raw.github.com/skanga/BashWin/master/runbash.bat and rename it to the same name as your bash script and place it in the same folder too. In the case of the example above it would be named bacftp.bat. So for example.

wget https://raw.github.com/skanga/BashWin/master/runbash.bat
ren runbash.bat c:\bin\bacftp.bat
cd \bin
bacftp

Now just run bacftp and it should work as expected

NOTE: Once you have these two files downloaded you do not need to get them again. Just keep copying/renaming runbash.bat to whatever new scripts you write.

How does it work?

Busybox.exe is a single binary that contains a large number of unix utilities within it. The batch file does some intricate wranging with busybox itself to produce the .aliases file that points all the utilities back to busybox itself. So when they are called from your bash script they all work. Then is runs your script under the bash interpreter built into busybox.

Which commands are supported?

Whatever is built-in on the version of busybox.exe that you have should work. For the one referenced in the link above the following commands work.

Currently defined functions:
        [, [[, ar, ash, awk, base64, basename, bash, bbconfig, bunzip2, bzcat,
        bzip2, cal, cat, catv, cksum, cmp, comm, cp, cpio, cut, date, dc, dd,
        diff, dirname, dos2unix, echo, ed, egrep, env, expand, expr, false,
        fgrep, find, fold, getopt, grep, gunzip, gzip, hd, head, hexdump, kill,
        killall, length, ls, lzcat, lzma, lzop, lzopcat, md5sum, mkdir, mv, od,
        pgrep, pidof, printenv, printf, ps, pwd, rm, rmdir, rpm2cpio, sed, seq,
        sh, sha1sum, sha256sum, sha512sum, sleep, sort, split, strings, sum,
        tac, tail, tar, tee, test, touch, tr, true, uncompress, unexpand, uniq,
        unix2dos, unlzma, unlzop, unxz, unzip, usleep, uudecode, uuencode, vi,
        wc, wget, which, whoami, xargs, xz, xzcat, yes, zcat

In case you have another version with more (or less) built-in commands than this one they will all still work.

Any gotchas?

Of course! First of all you have to be very careful about path separator chars. Secondly the busybox version of your favorite command may not support all the switches/flags of the full version (although I have yet to run into this problem) and lastly this is not easy to debug.

About

An attempt at allowing bash scripts to run on a Windows box

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published