Why `echo -n hello | while read v; do echo $v; done' prints nothing?
Following command also prints nothing, confused :( for ((i = 0; i 10; ++i)); do echo -n $i; done | while read v; do echo $v; done -- Clark
Re: Why `echo -n hello | while read v; do echo $v; done' prints nothing?
On Thu, Dec 02, 2010 at 11:33:24AM -0500, Greg Wooledge wrote: On Thu, Dec 02, 2010 at 09:29:29AM -0700, Eric Blake wrote: On 12/02/2010 04:04 AM, Clark J. Wang wrote: Following command also prints nothing, confused :( for ((i = 0; i 10; ++i)); do echo -n $i; done | while read v; do echo $v; done http://www.faqs.org/faqs/unix-faq/shell/bash/ FAQ E4. That was my first thought as well, upon first glance. But that's not the actual problem here. It's the lack of newline causing read to return 'failure' even though it does read the input. Yeah, it has bitten me too many times. I keep forgetting it though. -- William
Re: echo ${HOME#$*/} segfaults
On 11/30/10 8:43 PM, David Rochberg wrote: Bash Version: 4.1 Patch Level: 5 Release Status: release Description: echo ${HOME#$*/} segfaults Thanks for the report. -- ``The lyf so short, the craft so long to lerne.'' - Chaucer ``Ars longa, vita brevis'' - Hippocrates Chet Ramey, ITS, CWRUc...@case.eduhttp://cnswww.cns.cwru.edu/~chet/
Re: Why `echo -n hello | while read v; do echo $v; done' prints nothing?
On Thu, Dec 2, 2010 at 11:49 PM, Greg Wooledge wool...@eeg.ccf.org wrote: On Thu, Dec 02, 2010 at 07:04:57PM +0800, Clark J. Wang wrote: Following command also prints nothing, confused :( for ((i = 0; i 10; ++i)); do echo -n $i; done | while read v; do echo $v; done The output from the first command in the pipeline does not end with a newline. Therefore, 'read' in the second command returns 'failure' (non-zero) when it reads the first line of input, and your loop never iterates. But is that reasonable? I think read should return success in this case which makes more sense to me. Does the POSIX standards require that? -- Clark
Re: Why `echo -n hello | while read v; do echo $v; done' prints nothing?
On 12/02/2010 07:02 PM, Clark J. Wang wrote: The output from the first command in the pipeline does not end with a newline. Therefore, 'read' in the second command returns 'failure' (non-zero) when it reads the first line of input, and your loop never iterates. But is that reasonable? I think read should return success in this case which makes more sense to me. Does the POSIX standards require that? POSIX requires that the input to read be a text file (and by the definition of text file in POSIX, it must either be empty or end in a newline). By violating POSIX and passing something that does not end in a newline, you are no longer bound by the rules of POSIX. Therefore, it would be a reasonable bash extension that read could return 0 status if it read data that did not end in a newline, but it would not be a standard-compliant script that relied on such an extension. You're better off supplying the trailing newline, and guaranteeing a compliant usage. -- Eric Blake ebl...@redhat.com+1-801-349-2682 Libvirt virtualization library http://libvirt.org signature.asc Description: OpenPGP digital signature