Subject: Re: bug#22205: tee bug?
From: Eric Blake <[email-masked]>
To: Nacho Esteban <[email-masked]>, [email-masked]
Date: Fri, 18 Dec 2015 09:43:51 -0700
List-Id: <debbugs-submit.debbugs.gnu.org>

tag 22205 notabug
thanks

On 12/18/2015 06:18 AM, Nacho Esteban wrote:
> Hi team,
> 
> I detected an strange behaviour of tee command that may bee a bug.

Not a bug in tee, but intentional behavior of your shell.

> 
> Please consider this script snippet
> 
>    VAR=""
> 
>    A() {
>         VAR="This is my value"
>         echo "VAR in $FUNCNAME: $VAR"
>    }
> 
>    BA() {
>         A | tee /tmp/kk

You are using a pipeline.  Shells implement pipelines by running the
left command (here, the function A) in a subshell. (POSIX also says that
the right command can also be a subshell, but there it is not required;
ksh runs the right command in the current shell, and bash used to run it
in a subshell but new enough bash now has a knob you can turn on to
emulate ksh behavior).

Therefore, all changes to the environment made during the execution of A
are local to that subshell, and are lost as soon as the subshell exits.

>         echo "VAR in $FUNCNAME: $VAR"

Thus, here you print the value of $VAR as it was before A ran, since
running A does not affect the current shell.

> In fact if "| tee /tmp/kk" is removed value of VAR is properly visible
> from BA function:

Because then you no longer have a subshell, so now the execution of
function A affects the current shell.  Again, not tee's fault.  You
could replace it with "| :" and see the same effect.

> This e-mail (including any attachments) is confidential and may be
> privileged or

Such a disclaimer is unenforceable on publically-archived lists, and you
may want to consider not using your employer's spammy email gateway when
sending mail to public lists.

-- 
Eric Blake   eblake redhat com    +1-919-301-3266
Libvirt virtualization library http://libvirt.org