This is the mail archive of the cygwin mailing list for the Cygwin project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: 1.5.9: Trouble with setting variables using 'read' in a script


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/


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]