zsh-workers
 help / color / mirror / code / Atom feed
From: Bart Schaefer <schaefer@brasslantern.com>
To: Antoine Pietri <antoine.pietri1@gmail.com>
Cc: Zsh hackers list <zsh-workers@zsh.org>
Subject: Re: zsh built-in commands are removed when passing through a built-in command that spawns commands
Date: Wed, 15 May 2013 12:28:41 -0700	[thread overview]
Message-ID: <CAH+w=7YdGoCpWDjCt=Zqyqis0MWxukO9VLGZUHFm4d5=jcb1AA@mail.gmail.com> (raw)
In-Reply-To: <CAH+w=7Yvqw-w1-o+q_CTALjQyYcAZLAVhsK4HYX7BfJEFHa5-w@mail.gmail.com>

On Wed, May 15, 2013 at 10:33 AM, Bart Schaefer
<schaefer@brasslantern.com> wrote:
>
> Well, that indicates that the builtin time is still there.  So
> something else must be going on.

Aha.  I can in fact reproduce it, I was misled by $TIMEFMT.

So ... what's happening is that the shell can't time itself timing
time, if you see what I mean. The trivial case is

% time time true

The built-in time [which is actually a keyword rather than a command,
which is why
  % time (sublist)
works at all] is executed in the current shell and is able to record
the elapsed time for a single "job".  If that job is also executed in
the current shell, the built-in handles that by reading the time stats
for the shell itself.  If that current-shell-job in turn is also the
built-in time, there's no nested set of time stats available ...
either the outer time has to be abandoned [or reported incorrectly] or
the inner one has to be handled differently.

Zsh chooses to solve this during parsing by simply not recognizing the
time keyword inside another time keyword.  You can see this by the
strange parse error in this example:

% time (true)
( true; )  0.00s user 0.00s system 48% cpu 0.001 total
% time time (true)
zsh: missing end of name
time (true)  0.00s user 0.00s system 49% cpu 0.001 total

A possible alternative would be for a nested "time" keyword to force
itself into a subshell.  This wouldn't cost any more processes than
the current approach of falling back to the external time command.
Unfortunately this is not entirely trivial to implement, though
someone who knows the internal wordcode representation better than I
do could probably do it reasonably quickly.

An intermediate approach is to recognize nested time keywords in
explicit subshells, which turns out to be pretty straightforward.  If
that were implemented,

% time ( time true )

would use the keyword in both positions, but

% time time true
% time { time true }

would behave as they do now.  We'd want to implement the subshell
variant anyway in order to avoid an unnecessary fork for the time
keyword inside the subshell, but by itself it'd introduce even more
inconsistency.


      reply	other threads:[~2013-05-15 19:29 UTC|newest]

Thread overview: 5+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2013-05-15 14:14 Antoine Pietri
2013-05-15 17:24 ` Bart Schaefer
2013-05-15 17:26   ` Antoine Pietri
2013-05-15 17:33     ` Bart Schaefer
2013-05-15 19:28       ` Bart Schaefer [this message]

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to='CAH+w=7YdGoCpWDjCt=Zqyqis0MWxukO9VLGZUHFm4d5=jcb1AA@mail.gmail.com' \
    --to=schaefer@brasslantern.com \
    --cc=antoine.pietri1@gmail.com \
    --cc=zsh-workers@zsh.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
Code repositories for project(s) associated with this public inbox

	https://git.vuxu.org/mirror/zsh/

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).