Hi Igor, I agree with what you say except for one point: the command
AAA=aaa echo $AAA does **NOT** set the shell variable AAA. Not before the echo command, not after the echo command. The shell variable is unchanged by this command. Only the environment variable AAA in the environment of the echo is changed. The echo is passed as argument the value of the AAA **shell** variable, not the AAA **environment** variable. (And as you say, this is expanded by the shell) Confusion in terminology sometimes arises because whenever a new shell starts, it initialises it's shell variables with the values it inherits from it's environment, people often forget that these two sets of variables are really quite independent, even though the shell deliberately tries to blur the destinction. I hope we're all clear now. /John Vincent.
From: Igor Pechtchanski <[EMAIL PROTECTED]>
Reply-To: [EMAIL PROTECTED]
To: John Vincent <[EMAIL PROTECTED]>
CC: [EMAIL PROTECTED]
Subject: Re: About ENV?
Date: Thu, 24 Oct 2002 14:13:55 -0400 (EDT)
John,
I fully understand your example. And I think it's you who is confused.
The example I provided was intended to illustrate that even though the
environment variable AAA *is* set to "aaa", the echo command *never sees*
that new value, as the sequence '$AAA' is expanded by the *originating
shell*, rather than the echo command itself. In fact, the echo command is
not even aware it's echoing the value of some environment variable -- all
it sees is the value. The parts of the example with the single quotes and
invoking another shell illustrated that once you protect the '$' from the
originating shell, the new shell *does* pick up the new value of the
environment variable.
In other words, if you invoke a shell script that internally uses the
value of AAA, it will see the new value. However, all the echo command
sees is the *value* of AAA, expanded for it by the originating shell,
which expansion happened *before* the assignment was in effect.
A careful reading of the bash man page, particularly the section on
variable substitution, might be helpful here.
Igor
On Thu, 24 Oct 2002, John Vincent wrote:
> Hi,
>
> I think you are confusing shell variables with environment
> variables. This is easy to do if you are not careful, since
> shell variables can be put into the environment using the
> "export" built-in command.
>
> Still, they are different things, and in this case the assignment
> is to an environment variable, not to a shell variable. It's
> done to keep backwards-compatibility with old shell scripts.
>
> The command:
>
> AAA=aaa echo $AAA
>
> does NOT change the shell variable AAA it changes the environment
> variable AAA for the echo command only. Maybe this example will
> make it clearer:
>
> Administrator@JPV ~
> $ AAA=bbb
>
> Administrator@JPV ~
> $ AAA=aaa echo $AAA
> bbb
>
> Administrator@JPV ~
> $
>
> In the above example the echo command is run with an environment
> variable AAA with a value of "aaa" but the shell variable AAA is
> passed with a value of "bbb" set on the previous line.
>
> I hope this helps.
>
> /John Vincent.
>
>
> >From: Igor Pechtchanski <[EMAIL PROTECTED]>
> >Reply-To: [EMAIL PROTECTED]
> >To: Andrew DeFaria <[EMAIL PROTECTED]>
> >CC: [EMAIL PROTECTED]
> >Subject: Re: About ENV?
> >Date: Fri, 18 Oct 2002 11:36:49 -0400 (EDT)
> >
> >On Fri, 18 Oct 2002, Andrew DeFaria wrote:
> >
> > > John Vincent wrote:
> > >
> > > > Hi,
> > > >
> > > > Not quite right there ... You can preceed a command with an
> > > > assignment, and the assigned variable is then put into the environment
> > > > of the command that is run. Thus the command
> > > > "echo" is run with an environment variable AAAA with the value aaaa.
> > > > However, this does not change the AAAA shell variable (which is
> > > > currently empty) so the echo prints a blank (it's empty argument) and
> > > > ignores the AAAA in it's environment.
> > > >
> > > > This syntax is useful for setting environment variables for one
> > > > command invocation only. They are not saved.
> > > >
> > > > I hope this fully explains what is going on.
> > >
> > > It doesn't. If "This syntax is useful for setting environment variables
> > > for one command invocation only" then the echo command should have
> > > echoed "aaa". Otherwise the syntax is not useful for setting environment
> > > variables for one command invocation. Perhaps what is meant is that this
> > > syntax is useful for overriding environment variables for one command
> > > invocation? However this leaves a glaring inconsistancy prone to error
> > > if the variable was not set already then no override takes place.
> >
> >Andrew,
> >
> >[pechtcha:~] AAAA=aaa && echo $AAAA
> >aaa
> >[pechtcha:~] AAAA=aaa echo $AAAA
> >
> >[pechtcha:~] AAAA=aaa eval 'echo $AAAA'
> >aaa
> >[pechtcha:~] AAAA=aaa sh -c 'echo $AAAA'
> >aaa
> >[pechtcha:~]
> >
> >Does this help?
> > Igor
--
http://cs.nyu.edu/~pechtcha/
|\ _,,,---,,_ [EMAIL PROTECTED]
ZZZzz /,`.-'`' -. ;-;;,_ [EMAIL PROTECTED]
|,4- ) )-,_. ,\ ( `'-' Igor Pechtchanski
'---''(_/--' `-'\_) fL a.k.a JaguaR-R-R-r-r-r-.-.-. Meow!
"Water molecules expand as they grow warmer" (C) Popular Science, Oct'02, p.51
_________________________________________________________________
Unlimited Internet access -- and 2 months free! Try MSN. http://resourcecenter.msn.com/access/plans/2monthsfree.asp
--
Unsubscribe info: http://cygwin.com/ml/#unsubscribe-simple
Bug reporting: http://cygwin.com/bugs.html
Documentation: http://cygwin.com/docs.html
FAQ: http://cygwin.com/faq/