--- a/sh.sem.c
+++ b/sh.sem.c
@@ -83,7 +83,7 @@ void
 execute(struct command *t, volatile int wanttty, int *pipein, int *pipeout,
     int do_glob)
 {
-    int    forked = 0;
+    int    expr, forked = 0;
     const struct biltins * volatile bifunc;
     pid_t pid = 0;
     int     pv[2];
@@ -188,7 +188,11 @@ execute(struct command *t, volatile int wanttty, int *pipein, int *pipeout,
 	if ((t->t_dcom[0][0] & (QUOTE | TRIM)) == QUOTE)
 	    memmove(t->t_dcom[0], t->t_dcom[0] + 1,
 		    (Strlen(t->t_dcom[0] + 1) + 1) * sizeof (*t->t_dcom[0]));
-	if ((t->t_dflg & F_REPEAT) == 0)
+	if (!(expr = ((bifunc = isbfunc(t)) &&
+		      (bifunc->bfunct == doexit ||
+		       bifunc->bfunct == dolet ||
+		       bifunc->bfunct == doif ||
+		       bifunc->bfunct == dowhile))))
 	    Dfix(t);		/* $ " ' \ */
 	if (t->t_dcom[0] == 0) {
 	    return;
@@ -290,10 +294,6 @@ execute(struct command *t, volatile int wanttty, int *pipein, int *pipeout,
 
 	/* is it a command */
 	if (t->t_dtyp == NODE_COMMAND) {
-	    /*
-	     * Check if we have a builtin function and remember which one.
-	     */
-	    bifunc = isbfunc(t);
  	    if (noexec) {
 		/*
 		 * Continue for builtins that are part of the scripting language
