[Top][All Lists]

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: noisy gnulib-tool on IRIX

From: Eric Blake
Subject: Re: noisy gnulib-tool on IRIX
Date: Wed, 08 Sep 2010 11:38:30 -0600
User-agent: Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv: Gecko/20100806 Fedora/3.1.2-1.fc13 Mnenhy/0.8.3 Thunderbird/3.1.2

On 09/08/2010 10:18 AM, Eric Blake wrote:
With modern shells, it should work just as well to
{ command; } 2>/dev/null

except of course, really old shells will fork a subshell in order to
execute redirected compound commands, so unless we have some indication
that this was fixed before some other feature we rely on was fixed ;-)

In this case, I'm not worried if an old shell forks. Rather, I'm trying
to optimize things so that bash can start with fewer forks, making the
startup experience slightly faster, especially for platforms like cygwin.

Unfortunately, bash 4.1 also forks for '{ unknown; } 2>/dev/null'. So the only way to optimize the goal scenario of bash is to play with fds. Dash, on the other hand, forks for '(unknown)' but not for '{ unknown; }'. On the other hand, I know that there have been patches proposed to bug-bash to avoid forking in more scenarios, so someday bash may be as efficient as dash.

we might need a test for that.

That's for sure. And I still plan to do a sampling of various shells to
confirm whether { command; } 2>/dev/null is sufficient at avoiding
output, regardless of whether it forks on older shells, as it looks
cleaner than using exec to fiddle around with fds.

Testing with truss on Solaris /bin/sh - running '{ unknown; } 2>/dev/null' is indeed enough to silence stderr, but the fork() occurs the same as with a subshell. What's really weird is the number of stat() calls in the same truss results: both the parent and the forked child did a PATH search for unknown - you'd think that either the parent would defer the PATH search to just the child if it's going to fork, or else the parent would be smart enough to not fork if the PATH search failed. Also, $? was set to 1 instead of 127.

FreeBSD /bin/sh is noisy for 'unknown 2>/dev/null', but silent for '{ unknown; } 2>/dev/null'; and both (unknown) and { unknown;} were sufficiently optimized to avoid the fork.

Irix /bin/sh was noisy for 'unknown 2>/dev/null', but silent for '{ unknown; } 2>/dev/null'. I'm not sure how to get the equivalent of strace on that platform.

AIX /bin/sh was already quiet for 'unknown 2>/dev/null'.

But this research doesn't help much if '{ unknown; } 2>/dev/null' doesn't shave a fork.

Eric Blake   address@hidden    +1-801-349-2682
Libvirt virtualization library http://libvirt.org

reply via email to

[Prev in Thread] Current Thread [Next in Thread]