delorie.com/archives/browse.cgi   search  
Mail Archives: djgpp-workers/2002/02/14/07:46:44

X-Authentication-Warning: delorie.com: mailnull set sender to djgpp-workers-bounces using -f
Subject: Re: Some small bash issues
From: Tim Van Holder <tim DOT van DOT holder AT pandora DOT be>
To: Eli Zaretskii <eliz AT is DOT elta DOT co DOT il>
Cc: djgpp-workers AT delorie DOT com
In-Reply-To: <Pine.SUN.3.91.1020214121957.28394L-100000@is>
References: <Pine DOT SUN DOT 3 DOT 91 DOT 1020214121957 DOT 28394L-100000 AT is>
X-Mailer: Evolution/1.0.2
Date: 14 Feb 2002 13:42:49 +0100
Message-Id: <1013690570.30677.90.camel@bender.falconsoft.be>
Mime-Version: 1.0
Reply-To: djgpp-workers AT delorie DOT com
Errors-To: nobody AT delorie DOT com
X-Mailing-List: djgpp-workers AT delorie DOT com
X-Unsubscribes-To: listserv AT delorie DOT com

On Thu, 2002-02-14 at 11:21, Eli Zaretskii wrote:
> 
> On 14 Feb 2002, Tim Van Holder wrote:
> 
> >    foo=bar ./shell-script
> > 
> > because everything in the script is simply a 'new command'.
> 
> I fail to see the difference between
> 
>      foo=bar ./script
> and
>      foo=bar echo $foo
> 
> What is the difference here?

I thought that bash would see

   foo=bar ./script

as

  foo=bar #!/bin/sh; first line; second line; ...

I tried this on a Linux box, using bash 2.03 (bog standard bash for
RH6.2).

[tim AT bender] /home/tim>unset foo
[tim AT bender] /home/tim>foo=bar echo $foo

[tim AT bender] /home/tim>foo=bar echo $foo

[tim AT bender] /home/tim>echo $foo        

* Note that this behaviour differs from ksh, where foo is defined after
  the first run (so the second and third echo both produce 'bar').
  Not sure if this is a bug in either ksh or bash.

Now for the interesting part:

[tim AT bender] /home/tim>cat >fooscript <<\EOF
More>echo $foo
More>EOF
[tim AT bender] /home/tim>chmod +x fooscript 
[tim AT bender] /home/tim>unset foo
[tim AT bender] /home/tim>foo=bar ./fooscript 
bar
[tim AT bender] /home/tim>cat >fooscript <<\EOF
More>#! /bin/sh
More>echo $foo
More>EOF
[tim AT bender] /home/tim>foo=bar ./fooscript 
bar
[tim AT bender] /home/tim>echo $foo

[tim AT bender] /home/tim>cat >fooscript <<\EOF
More>#! /usr/bin/perl5
More>print $ENV{"foo"} . "\n";
More>EOF
[tim AT bender] /home/tim>foo=bar ./fooscript 
bar
[tim AT bender] /home/tim>foo=bar perl -e 'print $ENV{"foo"} . "\n";'
bar
[tim AT bender] /home/tim>echo $foo

[tim AT bender] /home/tim>foo=bar perl -e 'print $ENV{"foo"} . "\n";'
bar

So running perl DOES set foo; running echo doesn't.


- Raw text -


  webmaster     delorie software   privacy  
  Copyright © 2019   by DJ Delorie     Updated Jul 2019