X-Authentication-Warning: delorie.com: mailnull set sender to djgpp-workers-bounces using -f Subject: Re: Some small bash issues From: Tim Van Holder To: Eli Zaretskii Cc: djgpp-workers AT delorie DOT com In-Reply-To: References: Content-Type: text/plain Content-Transfer-Encoding: 7bit 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 Precedence: bulk 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.