Implement $(SHELL)
diff --git a/exec.go b/exec.go
index 2092cb3..15a9b24 100644
--- a/exec.go
+++ b/exec.go
@@ -15,6 +15,7 @@
 	implicitRules []*Rule
 	suffixRules   map[string][]*Rule
 	firstRule     *Rule
+	shell         string
 
 	// target -> timestamp
 	done map[string]int64
@@ -59,10 +60,11 @@
 	echo        bool
 	dryRun      bool
 	ignoreError bool
+	shell       string
 }
 
-func evalCmd(ev *Evaluator, r runner, s string) []runner {
-	r = newRunner(r, s)
+func evalCmd(ev *Evaluator, r runner, s string, shell string) []runner {
+	r = newRunner(r, s, shell)
 	if strings.IndexByte(r.cmd, '$') < 0 {
 		// fast path
 		return []runner{r}
@@ -70,12 +72,13 @@
 	cmds := ev.evalExpr(r.cmd)
 	var runners []runner
 	for _, cmd := range strings.Split(cmds, "\n") {
-		runners = append(runners, newRunner(r, cmd))
+		runners = append(runners, newRunner(r, cmd, shell))
 	}
 	return runners
 }
 
-func newRunner(r runner, s string) runner {
+func newRunner(r runner, s string, shell string) runner {
+	r.shell = shell
 	for {
 		s = strings.TrimLeft(s, " \t")
 		if s == "" {
@@ -106,7 +109,7 @@
 	if r.dryRun {
 		return nil
 	}
-	args := []string{"/bin/sh", "-c", r.cmd}
+	args := []string{r.shell, "-c", r.cmd}
 	cmd := exec.Cmd{
 		Path: args[0],
 		Args: args,
@@ -315,7 +318,7 @@
 		dryRun: dryRunFlag,
 	}
 	for _, cmd := range rule.cmds {
-		runners = append(runners, evalCmd(ev, r, cmd)...)
+		runners = append(runners, evalCmd(ev, r, cmd, ex.shell)...)
 	}
 	for _, r := range runners {
 		err := r.run()
@@ -445,6 +448,11 @@
 }
 
 func (ex *Executor) exec(er *EvalResult, targets []string, vars *VarTab) error {
+	// TODO: We should move this to somewhere around evalCmd so that
+	// we can handle SHELL in target specific variables.
+	shellVar := vars.Lookup("SHELL")
+	ex.shell = shellVar.String()
+
 	ex.populateRules(er)
 
 	if len(targets) == 0 {
diff --git a/func.go b/func.go
index 1f404e1..73dd8da 100644
--- a/func.go
+++ b/func.go
@@ -547,7 +547,9 @@
 func (f *funcShell) Eval(w io.Writer, ev *Evaluator) {
 	assertArity("shell", 1, len(f.args))
 	arg := ev.Value(f.args[0])
-	cmdline := []string{"/bin/sh", "-c", string(arg)}
+	shellVar := ev.LookupVar("SHELL")
+	// TODO: Should be Eval, not String.
+	cmdline := []string{shellVar.String(), "-c", string(arg)}
 	cmd := exec.Cmd{
 		Path:   cmdline[0],
 		Args:   cmdline,
diff --git a/main.go b/main.go
index 6ab0aff..3470909 100644
--- a/main.go
+++ b/main.go
@@ -46,6 +46,7 @@
 MAKE:=kati
 # Pretend to be GNU make 3.81, for compatibility.
 MAKE_VERSION:=3.81
+SHELL:=/bin/sh
 # TODO: Add more builtin vars.
 
 # http://www.gnu.org/software/make/manual/make.html#Catalogue-of-Rules