Kevan Gelling wrote:
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'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
I can get it work by explicitly declaring the file descriptor with the fileThis doesn't create a sub-shell, so the variable being read is the one in the script.
redirection, but I'd prefer to use a pipe.
- read -u 0 var <file ; echo $var
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/