This is the mail archive of the
cygwin
mailing list for the Cygwin project.
Re: 1.5.9: Trouble with setting variables using 'read' in a script
- From: Andy Rushton <ajr1 at ecs dot soton dot ac dot uk>
- To: Kevan Gelling <Kevan dot Gelling at euphony dot co dot uk>
- Cc: Cygwin mailing list <cygwin at cygwin dot com>
- Date: Thu, 06 May 2004 15:13:43 +0100
- Subject: Re: 1.5.9: Trouble with setting variables using 'read' in a script
- Organization: Southampton University
- References: <201BC46BD93D244AB0A910D1203FFC1904B6A873@ecexchange02.euphony.com>
Kevan Gelling wrote:
I'm having trouble setting variables using the 'read' command in bash.
All of the following lines fail to set $var and return a blank line.
- echo "text" | read var ; echo $var
- cat file | read var ; echo $var
- read var < file | echo $var
The problem is that the pipeline is executed by spawning a sub-process
and running a sub-shell in it. The variable that is being read into is
actually a copy that exists within that sub-shell, not the original that
you declared in the script. Variables set in sub-shells cannot be passed
back to their parent shell (the script itself).
I can get it work by explicitly declaring the file descriptor with the file
redirection, but I'd prefer to use a pipe.
- read -u 0 var <file ; echo $var
This doesn't create a sub-shell, so the variable being read is the one
in the script.
Another related quirk, is that variables set within 'while read' loops lose
their values once the loop ends. The following example displays "text text"
within the loop and blank line outside.
- echo "text" |\
while read
do
foo=$REPLY ; bar="text"
echo $foo $bar
done
echo $foo $bar
The while loop also becomes a sub-shell. Same problem as the pipeline.
This is a 'feature' of bash and indeed all Bourne-shell derivatives. It
makes a lot of shell features much harder to use than you would expect.
Incidentally, this is why you cannot write shell scripts to change your
environment. The script runs in a sub-shell, changes the local copy of
the environment and then discards the local copy on exit leaving the
parent shell in the same state as it was in before.
Andy
--
Andy Rushton, Southampton, UK
We may eventually come to realize that chastity is no more a virtue
than malnutrition.
-- Alex Comfort
--
Unsubscribe info: http://cygwin.com/ml/#unsubscribe-simple
Problem reports: http://cygwin.com/problems.html
Documentation: http://cygwin.com/docs.html
FAQ: http://cygwin.com/faq/