diff --git a/src/function.c b/src/function.c
index d7c13923..9add8f65 100644
--- a/src/function.c
+++ b/src/function.c
@@ -2012,24 +2012,10 @@ func_shell_base (char *o, char **argv, int trim_newlines)
       }
     shell_function_pid = 0;
 
-    /* shell_completed() will set shell_function_completed to 1 when the
-       child dies normally, or to -1 if it dies with status 127, which is
-       most likely an exec fail.  */
-
-    if (shell_function_completed == -1)
-      {
-        /* This likely means that the execvp failed, so we should just
-           write the error message in the pipe from the child.  */
-        fputs (buffer, stderr);
-        fflush (stderr);
-      }
-    else
-      {
-        /* The child finished normally.  Replace all newlines in its output
-           with spaces, and put that in the variable output buffer.  */
-        fold_newlines (buffer, &i, trim_newlines);
-        o = variable_buffer_output (o, buffer, i);
-      }
+    /* Replace all newlines in the command's output with spaces, and put that
+       in the variable output buffer.  */
+    fold_newlines (buffer, &i, trim_newlines);
+    o = variable_buffer_output (o, buffer, i);
 
     free (buffer);
   }
diff --git a/tests/run_make_tests.pl b/tests/run_make_tests.pl
index 4cc375e5..188a57c4 100644
--- a/tests/run_make_tests.pl
+++ b/tests/run_make_tests.pl
@@ -108,6 +108,7 @@ $ERR_read_only_file = undef;
 $ERR_unreadable_file = undef;
 $ERR_nonexe_file = undef;
 $ERR_exe_dir = undef;
+$ERR_command_not_found = undef;
 
 {
   use locale;
@@ -164,6 +165,15 @@ $ERR_exe_dir = undef;
 
   unlink('file.out') or die "Failed to delete file.out: $!\n";
 
+  $_ = `/bin/sh -c 'bad-command 2>&1'`;
+  if ($? == 0) {
+      print "Invoked invalid file!  Skipping related tests.\n";
+  } else {
+      chomp($_);
+      s/bad-command/#CMDNAME#/g;
+      $ERR_command_not_found = $_;
+  }
+
   $loc and POSIX::setlocale(&POSIX::LC_ALL, $loc);
 }
 
diff --git a/tests/scripts/functions/shell b/tests/scripts/functions/shell
index 59865293..63320a2b 100644
--- a/tests/scripts/functions/shell
+++ b/tests/scripts/functions/shell
@@ -46,10 +46,11 @@ if ($port_type ne 'W32') {
     # This needs to be ported to Windows, or else Windows error messages
     # need to converted to look like more normal make errors.
     run_make_test('
+.RECIPEPREFIX = >
 all:
-	@echo hi
-	$(shell ./basdfdfsed there)
-	@echo $(.SHELLSTATUS)
+>@echo hi
+>$(shell ./basdfdfsed there)
+>@echo $(.SHELLSTATUS)
 ',
                   '', "#MAKE#: ./basdfdfsed: $ERR_no_such_file\nhi\n127\n");
 
@@ -81,10 +82,17 @@ $(shell kill -2 $$$$)
 STAT := $(.SHELLSTATUS)
 all: ; @echo STAT=$(STAT)
               ','',"STAT=$ret\n");
+
+    # Test that not-found errors can be redirected
+    if ($ERR_command_not_found) {
+        $_ = $ERR_command_not_found;
+        s/#CMDNAME#/bad-command/g;
+        run_make_test(q!
+out := $(shell bad-command 2>&1)
+all: ; @echo '$(.SHELLSTATUS): $(out)'
+!,
+                      '', "127: $_\n");
+    }
 }
 
 1;
-
-### Local Variables:
-### eval: (setq whitespace-action (delq 'auto-cleanup whitespace-action))
-### End: