Skip site navigation (1)Skip section navigation (2)
Date:      Sat, 19 Mar 2011 13:12:47 -0400
From:      Maxim Khitrov <max@mxcrypt.com>
To:        Devin Teske <dteske@vicor.com>
Cc:        FreeBSD <freebsd-questions@freebsd.org>, Andres Perera <andres.p@zoho.com>, 839273@gmail.com
Subject:   Re: Shell script termination with exit function in backquotes
Message-ID:  <AANLkTi=W=4hFDHV8ryRcoxT%2BPnwUkWmYnUfuTLyfjNu4@mail.gmail.com>
In-Reply-To: <EFA32C5B-1892-41C3-B34B-F96E75CA72CA@vicor.com>
References:  <AANLkTi=-CFmxRicGcosvzhBbM3DMjbWwQNirMrJ1_KP=@mail.gmail.com> <759A467E-407A-4DB8-9756-08011B5405F0@vicor.com> <AANLkTi=CXLFUBhnY1LuhkeUiGHHGZ43yd%2BMYE9L50_O4@mail.gmail.com> <AANLkTimrnV2rJLyc3M4e3gGy_GUDLXp128f6n8svM3_g@mail.gmail.com> <AANLkTim0GvnAyK3%2B=Bd1Sr=maz0B3Ybgve_c6FKWwfNs@mail.gmail.com> <AANLkTimWxiRQNG3Um__kY-6%2BQ59g5yZT-Kt0qLAqTWOO@mail.gmail.com> <EFA32C5B-1892-41C3-B34B-F96E75CA72CA@vicor.com>

next in thread | previous in thread | raw e-mail | index | archive | help
On Sat, Mar 19, 2011 at 12:44 PM, Devin Teske <dteske@vicor.com> wrote:
>
> On Mar 19, 2011, at 9:15 AM, Maxim Khitrov wrote:
>
>> On Mon, Mar 14, 2011 at 6:40 PM, Andres Perera <andres.p@zoho.com> wrote=
:
>>> On Mon, Mar 14, 2011 at 7:46 AM, Maxim Khitrov <max@mxcrypt.com> wrote:
>>>> On Mon, Mar 14, 2011 at 3:16 AM, Andres Perera <andres.p@zoho.com> wro=
te:
>>>>> On Sun, Mar 13, 2011 at 9:49 PM, Devin Teske <dteske@vicor.com> wrote=
:
>>>>>> If you make the changes that I've suggested, you'll have consistent =
execution. The reason you're having inconsistent behavior is because Linux =
has /bin/sh symbolically linked to /bin/bash while FreeBSD has a more tradi=
tional shell (we'll call it bourne shell "plus").
>>>>>
>>>>> that is misleading because command substitutions have traditionally
>>>>> invoked subshells, and freebsd sh(1)/ash is an exception, not the nor=
m
>>>>>
>>>>> in this case, ksh and bash deviates are clearly closer to standard
>>>>> bourne behaviour
>>>>>
>>>>
>>>> Thanks for that explanation. I can understand the benefits of
>>>> optimizing away subshell execution, but that can clearly lead to
>>>> unexpected behavior. Is there some documentation on when this
>>>> optimization is utilized (i.e. the command executed without a
>>>> subshell)? Would I be correct in assuming that it is only restricted
>>>> to built-in commands that are known not to produce any output, such as
>>>> 'exit'?
>>>
>>> i would check the source, autoconf docs, and http://www.in-ulm.de/~masc=
heck/
>>>
>>> netbsd has =C2=A0been patched to fix `exit 1`, according to the last si=
te
>>
>> Here's another, but related, problem that I just ran into. The man page =
reads:
>>
>> =C2=A0 =C2=A0 Commands may be grouped by writing either
>> =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 (list)
>> =C2=A0 =C2=A0 or
>> =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 { list; }
>> =C2=A0 =C2=A0 The first form executes the commands in a subshell. =C2=A0=
Note that built-in
>> =C2=A0 =C2=A0 commands thus executed do not affect the current shell...
>>
>> Here's my script:
>>
>> ----
>> #!/bin/sh
>>
>> { A=3D1; }; =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 echo $A
>> echo | { B=3D2; }; =C2=A0 =C2=A0 =C2=A0echo $B
>> { C=3D3; } > /dev/null; echo $C
>> ----
>>
>> And here's the output:
>>
>> ----
>> 1
>>
>> 3
>> ----
>>
>> Where did the '2' go?
>
> You're learning that there are deviations to the rule as-mentioned in the=
 man-page.

I've learned this a long time ago :)

My point is that these deviations should be noted in the man page to
help eliminate such surprises. A single sentence would have sufficed
in this case.

> The reason for these deviations is quite simple in-fact...
>
> The shell needs to create a new set of stdin/stdout file-descriptors for =
the block of commands that you've created, and executing said commands with=
in a sub-shell achieves that.

Something very similar to this should be noted in the man page. I
figured out why my code wasn't working quickly after thinking about
how data would be piped to stdin. Others may waste a lot of time
trying to figure out why their code doesn't do what the man page
states it should be doing.

- Max



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?AANLkTi=W=4hFDHV8ryRcoxT%2BPnwUkWmYnUfuTLyfjNu4>