Path: csiph.com!goblin2!goblin1!goblin.stu.neva.ru!usenet.stanford.edu!not-for-mail From: Greg Wooledge Newsgroups: gnu.bash.bug Subject: Re: When reading less than wanted characters, "read" does not detect NUL bytes Date: Fri, 15 Jun 2018 09:07:46 -0400 Lines: 18 Approved: bug-bash@gnu.org Message-ID: References: <0Mfn88-1fqxyA1P40-00NBdT@mail.gmx.com> NNTP-Posting-Host: lists.gnu.org Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii X-Trace: usenet.stanford.edu 1529068106 7780 208.118.235.17 (15 Jun 2018 13:08:26 GMT) X-Complaints-To: action@cs.stanford.edu To: bug-bash@gnu.org Envelope-to: bug-bash@gnu.org Mail-Followup-To: bug-bash@gnu.org Content-Disposition: inline In-Reply-To: <0Mfn88-1fqxyA1P40-00NBdT@mail.gmx.com> User-Agent: NeoMutt/20170113 (1.7.2) X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] [fuzzy] X-Received-From: 139.137.100.1 X-BeenThere: bug-bash@gnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: Bug reports for the GNU Bourne Again SHell List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Xref: csiph.com gnu.bash.bug:14238 On Fri, Jun 15, 2018 at 03:03:21PM +0200, Davide Brini wrote: > $ printf 'a\x00\x00bc' | { while IFS= read -d '' -n 2 var; do echo "read: $var, length: ${#var}"; done; } > read: a, length: 1 > read: , length: 0 > read: bc, length: 2 > > I would expect there to be another read of length 0 between the "a" and the > "bc". Seems correct to me. You asked it to stop reading when it finds a NUL or when it has read 2 characters. The first time, they both happen at the same time, and you end up with "a", and two bytes have been consumed. The second time, it happens after reading the NUL byte, so you get "" and a total of three bytes have been consumed. The third time, you read "bc", and all the bytes have been consumed.