patch 9.0.0815
diff --git a/src/ex_cmds.c b/src/ex_cmds.c
index 93f9dd7..676ab70 100644
--- a/src/ex_cmds.c
+++ b/src/ex_cmds.c
@@ -929,6 +929,8 @@
 	    STRCAT(t, newcmd);
 	if (ins_prevcmd)
 	    STRCAT(t, prevcmd);
+	else
+	    vim_free(t);
 	p = t + STRLEN(t);
 	STRCAT(t, trailarg);
 	vim_free(newcmd);
@@ -957,17 +959,13 @@
 	}
     } while (trailarg != NULL);
 
-    // Don't do anything if there is no command as there isn't really anything
-    // useful in running "sh -c ''".  Avoids changing "prevcmd".
-    if (STRLEN(newcmd) == 0)
+    // Don't clear "prevcmd" if there is no command to run.
+    if (STRLEN(newcmd) > 0)
     {
-	vim_free(newcmd);
-	return;
+	vim_free(prevcmd);
+	prevcmd = newcmd;
     }
 
-    vim_free(prevcmd);
-    prevcmd = newcmd;
-
     if (bangredo)	    // put cmd in redo buffer for ! command
     {
 	// If % or # appears in the command, it must have been escaped.