X-Recipient: archive-cygwin AT delorie DOT com X-SWARE-Spam-Status: No, hits=-2.6 required=5.0 tests=BAYES_00,SPF_PASS X-Spam-Check-By: sourceware.org Content-Type: text/plain; charset=utf-8; format=flowed; delsp=yes To: "cygwin AT cygwin DOT com" Subject: Re: Can't set variables in a while loop that is passed to the rest of the script. References: <4B4FAB5D DOT 4000106 AT bopp DOT net> Date: Fri, 15 Jan 2010 02:39:12 +0100 MIME-Version: 1.0 Content-Transfer-Encoding: 8bit From: "Matthias Andree" Message-ID: In-Reply-To: <4B4FAB5D.4000106@bopp.net> User-Agent: Opera Mail/10.10 (Linux) X-IsSubscribed: yes Mailing-List: contact cygwin-help AT cygwin DOT com; run by ezmlm Precedence: bulk List-Id: List-Unsubscribe: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: cygwin-owner AT cygwin DOT com Mail-Followup-To: cygwin AT cygwin DOT com Delivered-To: mailing list cygwin AT cygwin DOT com Am 15.01.2010, 00:40 Uhr, schrieb Jeremy Bopp : > On 1/14/2010 5:23 PM, Damo, David wrote: >> Hi, >> >> I have fixed the problem. It seems in cygwin it spawns a subshell even >> under bash. I used a for loop instead and everything worked nicely. >> >> for line in `sed 's/\$/^/g' $propfile` >> do >> nvpair=$(echo $line | awk -F"=" '{print $1,$2}') >> set -- $nvpair >> if [ ! "$1" = "" ]; then >> eval "$1"=\"$2\" >> fi >> done > > Interesting. Your workaround should work fine as long as the propfile > is not too large, I think. However, wouldn't it be easier to source a > properly massaged version of propfile instead? The observed behaviour ("sed ... | while read foo" not setting variables properly) is expected and documented, because the commands in a pipe will be launched in a subshell (per POSIX), where "in the current shell" is an exception you cannot rely on - as observed. See IEEE Std 1003.1-2008, Shell & Utilities, Shell Command Language, 2.12 Shell Execution Environment (near the end of the section). I'd consider using the for line a fix, rather than a workaround. I'd also recommend a good portion of caution when sourcing generated files. This all too easily becomes a major security concern unless combined with thorough error checking. "set -e" is a bare necessity, and security isn't halfway complete there... -- Matthias Andree -- Problem reports: http://cygwin.com/problems.html FAQ: http://cygwin.com/faq/ Documentation: http://cygwin.com/docs.html Unsubscribe info: http://cygwin.com/ml/#unsubscribe-simple