delorie.com/archives/browse.cgi   search  
Mail Archives: cygwin/2018/07/15/19:01:50

X-Recipient: archive-cygwin AT delorie DOT com
DomainKey-Signature: a=rsa-sha1; c=nofws; d=sourceware.org; h=list-id
:list-unsubscribe:list-subscribe:list-archive:list-post
:list-help:sender:to:from:subject:message-id:date:mime-version
:content-type:content-transfer-encoding; q=dns; s=default; b=jvj
ZV/pJQdOoO2IXm4IcnncxFBEK5FQ2jVNPgE48gdZ1kjyeqcbp3IPbs1TRN7sxWed
fIDS5QwAQklmJk1W0gmsazdhg2PxGqcfVo7lj/IUNQsX/efGOulmtjFU3zPRf/Ux
Kj2+FeiHDtjslYQZprPfs2TWR2MIPXcD0iogemjM=
DKIM-Signature: v=1; a=rsa-sha1; c=relaxed; d=sourceware.org; h=list-id
:list-unsubscribe:list-subscribe:list-archive:list-post
:list-help:sender:to:from:subject:message-id:date:mime-version
:content-type:content-transfer-encoding; s=default; bh=fE7nJibKi
yP2lZ4namImObnfXLA=; b=EdnVVrR+ktrQdMz/H0R+stRh6gKRJ9+tVHSKqp803
TatYh3KxOrPhrQBMXRMX9Ih6jioZWNrW/CRTeYysLT3fFyHedanVbe/id1t6W4sC
mCskfQgcRaw5SUFlvbNZtU4Yit5tBvwuGpqkvysy1jT0f0dMFVrT/TSgsMzJvpyn
cI=
Mailing-List: contact cygwin-help AT cygwin DOT com; run by ezmlm
List-Id: <cygwin.cygwin.com>
List-Subscribe: <mailto:cygwin-subscribe AT cygwin DOT com>
List-Archive: <http://sourceware.org/ml/cygwin/>
List-Post: <mailto:cygwin AT cygwin DOT com>
List-Help: <mailto:cygwin-help AT cygwin DOT com>, <http://sourceware.org/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
Authentication-Results: sourceware.org; auth=none
X-Spam-SWARE-Status: No, score=1.6 required=5.0 tests=BAYES_50,HTML_MESSAGE,RCVD_IN_DNSWL_NONE,SPF_NEUTRAL autolearn=no version=3.3.2 spammy=H*r:sk:sonic.g, yahoo.com, yahoocom, UD:yahoo.com
X-HELO: sonic306-4.consmr.mail.bf2.yahoo.com
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=yahoo.com; s=s2048; t=1531695686; bh=Et+iHZoIzoYWph7plxxj+B3qTprPTEcKHOx5aX3xstk=; h=To:From:Subject:Date:From:Subject; b=Cxh+udyaRgeCMNiMOSmpONTBsvbdq7oD0yqeQftQwdas9F/PbKuKHcO6KjCNxJTdSBAPMgPiJetwLIDL+NbzenvX6Nkrv83t0uwG+s0O1BrX7J47+cpcfngBPngBcPNwxI8zH9PqF9EqQltMT3QJD5FXh8gHxL/8ffYf94f2+Mj4uK88+EpwFwf1i6ZO7QaKOX31EERiJHXuMNML3qeyXCssMuTFZUvaDrwBbRWK66FXqRO73ZovrhUiA+LLoN7Kn/QKmvv8agkNLhPJC9tTA1EhXNfv7Vykv4U7eEp0qyIPfgoWbqsyZXJ3kOKqB1kr2Ikj3eUZz1MD+RGL8OTInw==
To: cygwin AT cygwin DOT com
From: BloomingAzaleas <rdbingham AT verizon DOT net>
Subject: BASH 4.4 mapfile/readarray/read builtins mis-behaving with pipe
Message-ID: <69b0bc3c-7ead-920e-f04b-ec631c3453b7@verizon.net>
Date: Sun, 15 Jul 2018 19:01:21 -0400
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.23) Gecko/20090812 Lightning/0.9 Thunderbird/2.0.0.23 Mnenhy/0.7.6.666
MIME-Version: 1.0
X-MIME-Autoconverted: from quoted-printable to 8bit by delorie.com id w6FN1m0l004901

Windows 10 Pro 10.0.17134 N/A Build 17134 patched through 15 July 
2018
Cygwin 2.10.0(0.325/5/3)
Bash 4.4.12(3)

Cygwin man pages show:

   mapfile [-d delim] [-n count] [-O origin] [-s count] [-t] [-u 
fd]  [-C  callback]  [-c quantum] [array]
   readarray  [-d delim] [-n count] [-O origin] [-s count] [-t] 
[-u fd] [-C callback] [-c        quantum] [array]
     Read lines from the standard input into the indexed array 
variable  array,  or ...

  read [-ers] [-a aname] [-d delim] [-i text] [-n nchars] [-N 
nchars]  [-p  prompt]  [-t timeout] [-u fd] [name ...]
      One  line  is read from the standard input, or ...

So the expectation is that all bash stdin re-directions such as 
pipes and left chevs should work.  For mapfile/readarry, the 
output array variable MAPFILE is described as being created if 
not array_var argument is given to mapfile.

A) Searched cygwin email list with terms 'mapfile', 'readarray' 
and 'read builtin'.  No obvious hits of recent vintage in summary 
result list.

B) Confirm, not using mapfile/readarry/read, that bash stdin 
redirs work as expected.

echo multi-line_arg | /bin/cat

/bin/cat < some_unix_fmt_file

/bin/cat <<END
some
lines
END

all work as expected.

C) Test mapfile/readarray/read in various stdin redir situations. 
Basic harnesses are :

mapfile/readarry HARNESS:
stdin or fd 0 feed to mapfile
then
: "${MAPFILE[@]:?MAPFILE null or unset}"
if get past the ${:?} test then dump MAPFILE with a simple /for 
/loop as: for ent in "${MAPFILE[@]}" ; do echo ="${ent}"= ; done

read HARNESS:
stdin feed to 'read foo'
then
: "${foo:?foo null or unset}"
if get past the ${:?} test then dump variable foo with echo 
="${foo}"=

CASES:
echo multi-line_arg | mapfile
cat multi-line_unix_fmt_file | mapfile
RESULT:
Fail with MAPFILE null or unset
If 'for' loop forced, "${MAPFILE[@]}" expands to zero words.

CASE:
echo multi-line_arg | read foo
cat multi-line_unix_fmt_file | read foo
  RESULT:
Fail with variable foo null or unset

CASES: left chev re-directions
mapfile < some_unix_fmt_file
mapfile <<END multi-line_here_doc
read < some_unix_fmt_file
read <<END multi-line_here_doc
RESULT:
Work as expected

CASES: mapfile or read in a sub-shell
echo multi-line_arg | ( mapfile ; stuff )
echo multi-line_arg | ( read foo; stuff )
RESULT:
Work as expected.  However, since mapfile/read result vars are 
not accessible in parent shell context, can force a notable 
re-structuring of a script to use sub-shells.

CONCLUSIONS:
For bash builtins mapfile/readarray and read, stdin pipe 
re-direction directly to the builtin fails as if the builtin 
read()/fread() sees a silent pre-mature EOF on the pipe.  In the 
sub-shell tests, the pipe re-direction happens for the sub-shell 
as a whole before commands internal to the sub-shell get 
processed for individual re-dirs, so no re-dir processing 
directly for the builtin.


--
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


- Raw text -


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