delorie.com/archives/browse.cgi   search  
Mail Archives: cygwin/2004/05/06/10:14:09

Mailing-List: contact cygwin-help AT cygwin DOT com; run by ezmlm
List-Subscribe: <mailto:cygwin-subscribe AT cygwin DOT com>
List-Archive: <http://sources.redhat.com/ml/cygwin/>
List-Post: <mailto:cygwin AT cygwin DOT com>
List-Help: <mailto:cygwin-help AT cygwin DOT com>, <http://sources.redhat.com/ml/#faqs>
Sender: cygwin-owner AT cygwin DOT com
Mail-Followup-To: cygwin AT cygwin DOT com
Delivered-To: mailing list cygwin AT cygwin DOT com
Message-ID: <409A4817.5010001@ecs.soton.ac.uk>
Date: Thu, 06 May 2004 15:13:43 +0100
From: Andy Rushton <ajr1 AT ecs DOT soton DOT ac DOT uk>
Organization: Southampton University
User-Agent: Mozilla Thunderbird 0.5 (Windows/20040207)
MIME-Version: 1.0
To: Kevan Gelling <Kevan DOT Gelling AT euphony DOT co DOT uk>
CC: Cygwin mailing list <cygwin AT cygwin DOT com>
Subject: Re: 1.5.9: Trouble with setting variables using 'read' in a script
References: <201BC46BD93D244AB0A910D1203FFC1904B6A873 AT ecexchange02 DOT euphony DOT com>
In-Reply-To: <201BC46BD93D244AB0A910D1203FFC1904B6A873@ecexchange02.euphony.com>
X-MailScanner-Information: Please contact helpdesk AT ecs DOT soton DOT ac DOT uk for more information
X-ECS-MailScanner: Found to be clean
X-IsSubscribed: yes

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/

- Raw text -


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