[ GSOC ] Differences in shell behaviour

Jilles Tjoelker jilles at stack.nl
Fri Jun 1 15:07:27 UTC 2012


On Fri, Jun 01, 2012 at 09:43:08AM +0200, Lars Engels wrote:
> On Fri, Jun 01, 2012 at 09:38:38AM +0400, Alexander Pyhalov wrote:
> > Good morning.

> > On 06/01/2012 07:53, Jason Hellenthal wrote:

> > > On Thu, May 31, 2012 at 11:21:10PM +0400, Alexander Pronin wrote:
> > >> The problem is:
> > >> ### sh in 8.3
> > >> $ false&  pid=$!
> > >> $
> > >> [1]   Done (1)                false
> > >> $ wait ${pid}
> > >> wait: No such job: 4852

> > > I don't see this behavior on 8.3-STABLE @r236350 i386
> > >   ---
> > > Console>  false&  pid=$!
> > > Console>  wait ${pid}
> > > [1]   Done (1)                false
> > > Console>  echo $?
> > > 1

> > It seems to behave differently, when you issue some additional commands 
> > or interact with shell.

> > first case (8.3 r234443):
> > $ false &pid=$!
> > $ wait ${pid}
> > [1]   Done (1)                false
> > $ echo $?
> > 1

> > second case (8.3 r234443):
> > $ false & pid=$!
> > $ # some interaction with shell
> > [1]   Done (1)                false
> > $ wait ${pid}
> > wait: No such job: 59092

> > Now, on 9.0-RELEASE
> > first case:
> > $ false & pid=$!
> > $ wait ${pid}
> > [1]   Done(1)                 false
> > $ echo $?
> > 1

> > second case:
> > $ false & pid=$!
> > $ # some activity
> > [1]   Done(1)                 false
> > $ wait ${pid}
> > $ echo $?
> > 1

> > Do you see the difference ? Which behavior is correct? Can it be a sh bug?

> Adding jilles to CC, he worked on sh(1) during the last months.

In 8.x, the 'jobs' utility and the implicit 'jobs -n'-like operation
before a prompt always cause sh to discard the record of the job and
its exit status. In 9.x, sh remembers jobs for which $! has been
referenced until they are 'wait'ed for, even if their completion is
otherwise reported, while jobs for which $! was not referenced are
forgotten as soon as they terminate.

This change was made to reduce memory usage from long-running scripts
that do not care about job completion, see PR bin/55346.

The part of the change that applies to interactive mode may, in fact, be
wrong, however useful it may be.

Some of the strange differences are due to an inherent race condition:
the child process may terminate before or after sh's check just before
displaying the prompt.

If you do your experiments using scripts instead of in interactive mode,
they should work in 8.x as well as in 9.x.

-- 
Jilles Tjoelker


More information about the freebsd-ports mailing list