@@ -100,12 +100,22 @@ should_suppress_fork (command)
100
100
((command -> flags & CMD_INVERT_RETURN ) == 0 ));
101
101
}
102
102
103
+ int
104
+ can_optimize_connection (command )
105
+ COMMAND * command ;
106
+ {
107
+ return (* bash_input .location .string == '\0' &&
108
+ (command -> value .Connection -> connector == AND_AND || command -> value .Connection -> connector == OR_OR || command -> value .Connection -> connector == ';' ) &&
109
+ command -> value .Connection -> second -> type == cm_simple );
110
+ }
111
+
103
112
void
104
113
optimize_fork (command )
105
114
COMMAND * command ;
106
115
{
107
116
if (command -> type == cm_connection &&
108
- (command -> value .Connection -> connector == AND_AND || command -> value .Connection -> connector == OR_OR ) &&
117
+ (command -> value .Connection -> connector == AND_AND || command -> value .Connection -> connector == OR_OR || command -> value .Connection -> connector == ';' ) &&
118
+ (command -> value .Connection -> second -> flags & CMD_TRY_OPTIMIZING ) &&
109
119
should_suppress_fork (command -> value .Connection -> second ))
110
120
{
111
121
command -> value .Connection -> second -> flags |= CMD_NO_FORK ;
@@ -412,8 +422,18 @@ parse_and_execute (string, from_file, flags)
412
422
command -> flags |= CMD_NO_FORK ;
413
423
command -> value .Simple -> flags |= CMD_NO_FORK ;
414
424
}
415
- else if (command -> type == cm_connection )
416
- optimize_fork (command );
425
+
426
+ /* Can't optimize forks out here execept for simple commands.
427
+ This knows that the parser sets up commands as left-side heavy
428
+ (&& and || are left-associative) and after the single parse,
429
+ if we are at the end of the command string, the last in a
430
+ series of connection commands is
431
+ command->value.Connection->second. */
432
+ else if (command -> type == cm_connection && can_optimize_connection (command ))
433
+ {
434
+ command -> value .Connection -> second -> flags |= CMD_TRY_OPTIMIZING ;
435
+ command -> value .Connection -> second -> value .Simple -> flags |= CMD_TRY_OPTIMIZING ;
436
+ }
417
437
#endif /* ONESHOT */
418
438
419
439
/* See if this is a candidate for $( <file ). */
0 commit comments