The attached patch "fixes" this:

    hp% ./bash -c 'time (TIMEFORMAT=y)'
    
    real    0m0.001s
    user    0m0.000s
    sys     0m0.000s
    hp% bash -c 'time (TIMEFORMAT=y)' 
    y

Disclaimer: I don't know if it's a good patch. It may break stuff.

This problem is caused due to bash passing `time ( ... )' as a COMMAND with
type = cm_subshell and flags = CMD_TIME_PIPELINE to execute_command_internal,
but since the case to handle type = cm_subshell is before the case to handle
flags = CMD_TIME_PIPELINE, the program forks, the time_command is executed
inside the new process and we all know what happens next.

My patch just adds a special case for this situation, and passes the command
directly to time_command.

I guess it might be better to just move the block of code handling the general
case when flags = CMD_TIME_PIPELINE, but I don't know if this will have any
undesired consequences.
diff --git a/execute_cmd.c b/execute_cmd.c
index def409f..9e17386 100644
--- a/execute_cmd.c
+++ b/execute_cmd.c
@@ -588,6 +588,13 @@ execute_command_internal (command, asynchronous, pipe_in, 
pipe_out,
   if (command->type == cm_subshell && (command->flags & CMD_NO_FORK))
     return (execute_in_subshell (command, asynchronous, pipe_in, pipe_out, 
fds_to_close));
 
+#if defined (COMMAND_TIMING)
+  if (command->type == cm_subshell && command->flags & CMD_TIME_PIPELINE)
+    {
+         return time_command (command, asynchronous, pipe_in, pipe_out, 
fds_to_close);
+       }
+#endif /* COMMAND_TIMING */
+
 #if defined (COPROCESS_SUPPORT)
   if (command->type == cm_coproc)
     return (execute_coproc (command, pipe_in, pipe_out, fds_to_close));

Reply via email to